← Назад к вопросам

Какой приоритет выполнения задач в Event Loop?

2.0 Middle🔥 211 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Приоритет выполнения задач в Event Loop

Event Loop (цикл событий) — это механизм, который управляет выполнением асинхронного кода в JavaScript. Понимание приоритета задач критически важно для написания производительных и отзывчивых приложений.

Основные фазы Event Loop

Event Loop в среде выполнения (например, Node.js или браузере) обрабатывает задачи в определённом порядке. Вот ключевые очереди (queues) или микрозадачи (microtasks) и макрозадачи (macrotasks):

  1. Макрозадачи (Macrotasks/Task Queue): К ним относятся:

    • setTimeout и setInterval
    • setImmediate (в Node.js)
    • I/O операции (чтение файлов, сетевые запросы)
    • Рендеринг UI (в браузерах)
    • События DOM (клики, загрузка)
  2. Микрозадачи (Microtasks/Job Queue):

    • Promise.then(), Promise.catch(), Promise.finally()
    • queueMicrotask()
    • MutationObserver (в браузерах)
    • process.nextTick() (в Node.js, имеет особый приоритет)

Порядок выполнения

Общий алгоритм одного цикла Event Loop:

// Пример для демонстрации порядка
console.log('1. Синхронный код');

setTimeout(() => console.log('2. setTimeout (макрозадача)'), 0);

Promise.resolve().then(() => console.log('3. Promise (микрозадача)'));

queueMicrotask(() => console.log('4. queueMicrotask (микрозадача)'));

console.log('5. Синхронный код конец');

// Вывод:
// 1. Синхронный код
// 5. Синхронный код конец
// 3. Promise (микрозадача)
// 4. queueMicrotask (микрозадача)
// 2. setTimeout (макрозадача)

Приоритет выполнения от высшего к низшему:

  1. Выполнение всего синхронного кода до завершения (стек вызовов пуст).
  2. Обработка микрозадач:
    • Все микрозадачи из очереди выполняются полностью, пока очередь не опустеет.
    • Если во время выполнения микрозадач появляются новые микрозадачи, они также выполняются в текущем цикле.
  3. Обработка одной макрозадачи из очереди (например, колбэк setTimeout).
  4. Повторение цикла (возврат к шагу 2).

Особенности в Node.js

В Node.js Event Loop более сложный и состоит из нескольких фаз:

// Пример порядка в Node.js
setImmediate(() => console.log('setImmediate'));
setTimeout(() => console.log('setTimeout'), 0);

Promise.resolve().then(() => console.log('Promise'));
process.nextTick(() => console.log('nextTick'));

// Возможный вывод:
// nextTick (выполняется перед всеми фазами)
// Promise
// setTimeout
// setImmediate

Фазы Event Loop в Node.js:

  • Timers: setTimeout, setInterval
  • Pending callbacks: отложенные колбэки (например, ошибки ввода-вывода)
  • Idle, prepare: внутренние фазы Node.js
  • Poll: получение новых I/O событий, выполнение их колбэков
  • Check: setImmediate
  • Close callbacks: закрытие ресурсов (например, socket.on('close'))

Важно: process.nextTick() выполняется после текущей операции, но перед переходом к следующей фазе Event Loop, даже до микрозадач.

Практическое значение

  • Микрозадачи имеют более высокий приоритет, что позволяет обновлять состояние до рендеринга (в браузере) или следующей асинхронной операции.
  • Длительные микрозадачи могут блокировать рендеринг или обработку I/O, так как Event Loop не перейдёт к макрозадачам, пока очередь микрозадач не опустеет.
  • В браузере после выполнения микрозадач может происходить рендеринг (обновление UI), затем снова макрозадачи.

Типичная ошибка

// Бесконечный цикл из микрозадач заблокирует Event Loop
function infiniteMicrotask() {
    Promise.resolve().then(infiniteMicrotask);
}
infiniteMicrotask(); // Макрозадачи (например, таймеры) никогда не выполнятся

Вывод: приоритеты в Event Loop — это синхронный код → все доступные микрозадачи → одна макрозадача → повторение. Понимание этого порядка помогает избегать проблем с производительностью, такими как задержки рендеринга или голодание Event Loop. Для оптимизации критически важных операций используйте разделение задач через setTimeout или queueMicrotask(), чтобы дать циклу событий возможность обрабатывать другие очереди.

Какой приоритет выполнения задач в Event Loop? | PrepBro