Как работает цикл событий (Event Loop) в Node.js?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Event Loop — это механизм, позволяющий Node.js выполнять неблокирующие I/O операции, несмотря на то, что JavaScript является однопоточным языком. Event Loop непрерывно мониторит стек вызовов, очередь колбэков и различные очереди событий (таймеры, I/O).
Основные фазы Event Loop:
- timers: Выполняет колбэки запланированные
setTimeout()иsetInterval(). - pending callbacks: Выполняет колбэки системных операций ввода-вывода (например, сетевых ошибок), отложенные до следующей итерации Event Loop.
- idle, prepare: Внутренние фазы Event Loop.
- poll:
- Вычисляет, как долго блокироваться и опрашивать операции ввода-вывода.
- Обрабатывает события в очереди I/O колбэков, когда их количество достигает определенного предела или исчерпывается время.
- check: Выполняет колбэки запланированные
setImmediate(). - 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 эффективно обрабатывать множество параллельных запросов без создания отдельного потока для каждого из них, что обеспечивает высокую производительность.