Назад к вопросам
Middle+
415
questionbank

Как работает цикл событий (Event Loop) в Node.js?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Event Loop — это механизм, позволяющий Node.js выполнять неблокирующие I/O операции, несмотря на то, что JavaScript является однопоточным языком. Event Loop непрерывно мониторит стек вызовов, очередь колбэков и различные очереди событий (таймеры, I/O).

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

  1. timers: Выполняет колбэки запланированные setTimeout() и setInterval().
  2. pending callbacks: Выполняет колбэки системных операций ввода-вывода (например, сетевых ошибок), отложенные до следующей итерации Event Loop.
  3. idle, prepare: Внутренние фазы Event Loop.
  4. poll:
    • Вычисляет, как долго блокироваться и опрашивать операции ввода-вывода.
    • Обрабатывает события в очереди I/O колбэков, когда их количество достигает определенного предела или исчерпывается время.
  5. check: Выполняет колбэки запланированные setImmediate().
  6. close callbacks: Выполняет колбэки закрытия, например, socket.destroy().

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

// Примеры планирования задач
console.log('Старт');

setTimeout(() => {
  console.log('Таймер 0');
}, 0);

setImmediate(() => {
  console.log('setImmediate');
});

process.nextTick(() => {
  console.log('nextTick');
});

Promise.resolve().then(() => {
  console.log('Promise');
});

console.log('Конец');

//  Типичный порядок выполнения (может варьироваться в зависимости от Node.js версии и нагрузки):
//  Старт
//  Конец
//  nextTick
//  Promise
//  Таймер 0  (Выполнится в фазе timers)
//  setImmediate (Выполнится в фазе check)

Event Loop позволяет Node.js эффективно обрабатывать множество параллельных запросов без создания отдельного потока для каждого из них, что обеспечивает высокую производительность.