Микро- и макро-задачи в JavaScript

Многопоточность - это то, что сделало возможными большие скорости вычислений. Сегодня это обязательная функция во всех операционных системах и языках программирования. Хотя даже старые языки, такие как C ++, добавляли встроенную поддержку потоков в несколько последних обновлений, JavaScript оставался упрямым.

Но, тем не менее, многопоточность была необходима в браузерах, поэтому концепция цикла событий используется для выполнения асинхронных функций в JavaScript. Цикл событий отслеживает очередь сообщений и стек выполнения, чтобы гарантировать выполнение функций обратного вызова, как только стек выполнения будет пуст. Функции обратного вызова делятся на микрозадачи и макрозадачи.

В этой статье мы рассмотрим разницу и потребность в микро- и макро-задачах в JavaScript. Начнем с вспомогательных концепций.

Стек выполнения

Среда, в которой выполняется элемент кода JavaScript, называется контекстом выполнения. В нем хранятся все локальные переменные для блока кода и критериев оценки. Каждая функция получает новый контекст выполнения, как только она вызывается. Эти контексты выполнения хранятся друг над другом в объекте, подобном контейнеру, который называется стеком выполнения.

Очередь сообщений

Когда функция обратного вызова вызывается в существующем контексте выполнения, она помещается в очередь сообщений. Они остаются в очереди до тех пор, пока стек выполнения не станет пустым, когда цикл событий, наконец, выполнит эти задачи. Чтение кода, постановка задач в очередь и выполнение задач выполняется циклом событий.

Эта очередь сообщений фактически делает эти задачи асинхронными и, таким образом, помогает программистам JavaScript реализовать многопоточность. Но, как видно, не все задачи в очереди сообщений создаются и обрабатываются одинаково. Далее они делятся на две очереди; очередь микро-задач и очередь макро-задач.

Микро-задачи и Макро-задачи

Проще говоря, микрозадачи используются для создания очереди синхронных задач внутри очереди сообщений, которая выполняется асинхронно со стеком выполнения.

Как выполняются микро- и макро-задачи?

В цикле событий есть очередь задач, которая является очередью макро-задач. Как только он начинает выполнять функции обратного вызова в очереди сообщений, он берет одну макро-задачу, выполняет ее и переходит к выполнению очереди микро-задач. Он продолжает выполнять очередь микрозадач, пока она не будет завершена. Затем он возвращается в очередь макро-задач (задач) и выполняет другую.

Может случиться так, что каждая микрозадача будет выстраивать в очередь новые микрозадачи, и мы застрянем в бесконечном цикле. Чтобы избежать этого, JavaScript ограничивает количество микрозадач, которые могут выполняться одновременно, до 1000. После 1000 микрозадач он должен выбрать макро-задачу, а затем вернуться в очередь микрозадач.

Рендеринг также блокируется во время выполнения микрозадач, чтобы пользовательский интерфейс оставался нетронутым для пользователя. Поэтому, если мы слишком долго застреваем в очереди микрозадач, страница может перестать отвечать.

Как разделить микро и макро задачи?

Программистам рекомендуется использовать микрозадачи, когда вы хотите синхронно выполнять некоторые функции асинхронно. В противном случае лучше всего использовать макрозадания.

Несколько примеров макрос-задач: setTimeout, setInterval, setImmediate, задачи ввода-вывода, рендеринг пользовательского интерфейса. В то время как обещания - это микрозадачи, поскольку они выполняются, как только вызывается их конструктор.

Подведение итогов

Мы обсудили различия, достоинства, недостатки и примеры микро- и макро-задач в JavaScript. Мы также немного коснулись того, как они используются для реализации многопоточности в браузерах с использованием JS. Надеюсь, это устранит любую путаницу, которая могла возникнуть у вас по этой теме. Если у вас остались вопросы, задавайте их в комментариях ниже.