Sobes.tech
Middle+

Чӣ тавр кор мекунад даврзании ҳодисаҳо (Event Loop) дар Node.js?

sobes.tech AI

Ҷавоб аз AI

Event Loop — это механизм, который позволяет Node.js выполнять неблокирующие операции ввода-вывода, несмотря на то, что 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 callbacks, когда их количество достигает определенного предела или исчерпывается время.
  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 эффективно обрабатывать множество параллельных запросов без создания отдельного потока для каждого из них, что обеспечивает высокую производительность.