Sobes.tech
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:

  1. timers: Wykonuje zaplanowane callbacki setTimeout() i setInterval().
  2. pending callbacks: Wykonuje callbacki operacji wejścia/wyjścia systemowego (np. błędy sieciowe), odłożone do następnej iteracji Event Loop.
  3. idle, prepare: Wewnętrzne fazy Event Loop.
  4. 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.
  5. check: Wykonuje callbacki zaplanowane setImmediate().
  6. 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ść.