Middle+
Jak działa pętla zdarzeń (Event Loop) w Node.js?
sobes.tech AI
Odpowiedź od AI
Event Loop — to mechanizm, który pozwala Node.js na wykonywanie operacji wejścia/wyjścia bez blokowania, mimo że JavaScript jest językiem jednordzeniowym. Event Loop nieprzerwanie monitoruje stos wywołań, kolejkę callbacków i różne kolejki zdarzeń (timery, I/O).
Główne fazy Event Loop:
- timers: Wykonuje zaplanowane callbacki
setTimeout()isetInterval(). - pending callbacks: Wykonuje callbacki operacji wejścia/wyjścia systemowego (np. błędy sieciowe), odłożone do następnej iteracji Event Loop.
- idle, prepare: Wewnętrzne fazy Event Loop.
- poll:
- Oblicza, jak długo blokować i sprawdzać operacje wejścia/wyjścia.
- Przetwarza zdarzenia w kolejce callbacków I/O, gdy ich liczba osiąga limit lub czas się kończy.
- check: Wykonuje callbacki zaplanowane
setImmediate(). - close callbacks: Wykonuje callbacki zamknięcia, np.
socket.destroy().
process.nextTick() i mikrozadania (obietnice, queueMicrotask()) są wykonywane między fazami Event Loop i przed przejściem do następnej fazy lub zakończeniem bieżącej. process.nextTick() ma wyższy priorytet niż mikrozadania.
// Przykłady planowania zadań
console.log('Start');
setTimeout(() => {
console.log('Timer 0');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
process.nextTick(() => {
console.log('nextTick');
});
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('Koniec');
// Typowy porządek wykonania (może się różnić w zależności od wersji Node.js i obciążenia):
// Start
// Koniec
// nextTick
// Promise
// Timer 0 (wykonuje się w fazie timers)
// setImmediate (w fazie check)
Event Loop pozwala Node.js efektywnie obsługiwać wiele równoległych żądań bez tworzenia osobnego wątku dla każdego z nich, co zapewnia wysoką wydajność.