Sobes.tech
Middle+

Jak funguje událostní smyčka (Event Loop) v Node.js?

sobes.tech AI

Odpověď od AI

Event Loop — je mechanismus, který umožňuje Node.js provádět neblokující I/O operace, i přestože JavaScript je jednovlákný jazyk. Event Loop nepřetržitě sleduje zásobník volání, frontu callbacků a různé fronty událostí (časovače, I/O).

Hlavní fáze Event Loop:

  1. timers: Spouští callbacky naplánované pomocí setTimeout() a setInterval().
  2. pending callbacks: Spouští callbacky systémových operací I/O (například síťové chyby), odložené do další iterace Event Loop.
  3. idle, prepare: Interní fáze Event Loop.
  4. poll:
    • Určuje, jak dlouho blokovat a dotazovat operace I/O.
    • Zpracovává události v frontě I/O callbacků, když jejich počet dosáhne limitu nebo vyprší čas.
  5. check: Spouští callbacky naplánované pomocí setImmediate().
  6. close callbacks: Spouští callbacky uzavření, například socket.destroy().

process.nextTick() a mikroúkoly (promise, queueMicrotask()) se vykonávají mezi fázemi Event Loop a před přechodem do další fáze nebo ukončením aktuální. process.nextTick() má vyšší prioritu než mikroúkoly.

// Příklady plánování úkolů
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('Konec');

// Typický pořadí provádění (může se lišit v závislosti na verzi Node.js a zátěži):
// Start
// Konec
// nextTick
// Promise
// Timer 0  (bude proveden v fázi timers)
// setImmediate (bude proveden ve fázi check)

Event Loop umožňuje Node.js efektivně zpracovávat mnoho paralelních požadavků bez vytváření samostatného vlákna pro každý z nich, což zajišťuje vysoký výkon.