Sobes.tech
Middle+

Cum funcționează bucla de evenimente (Event Loop) în Node.js?

sobes.tech AI

Răspuns de la AI

Event Loop — este un mecanism care permite Node.js să execute operații de I/O non-blocante, în ciuda faptului că JavaScript este un limbaj cu un singur fir de execuție. Event Loop monitorizează continuu stiva de apeluri, coada de callback-uri și diferite cozi de evenimente (temporizatoare, I/O).

Fazele principale ale Event Loop:

  1. timers: Execută callback-urile programate cu setTimeout() și setInterval().
  2. pending callbacks: Execută callback-urile operațiilor de intrare/ieșire ale sistemului (de exemplu, erori de rețea), amânate până la următoarea iterație a Event Loop.
  3. idle, prepare: Fazele interne ale Event Loop.
  4. poll:
    • Calculează cât timp să blocheze și să interogheze operațiile de intrare/ieșire.
    • Procesează evenimentele din coada de callback-uri I/O atunci când ating o limită sau timpul expiră.
  5. check: Execută callback-urile programate cu setImmediate().
  6. close callbacks: Execută callback-urile de închidere, de exemplu, socket.destroy().

process.nextTick() și microtask-urile (promisiuni, queueMicrotask()) se execută între fazele Event Loop și înainte de a trece la faza următoare sau de a finaliza cea curentă. process.nextTick() are prioritate mai mare decât microtask-urile.

// Exemple de planificare a sarcinilor
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('End');

// Ordinea tipică de execuție (poate varia în funcție de versiunea Node.js și de încărcare):
// Start
// End
// nextTick
// Promise
// Timer 0  (se va executa în faza timers)
// setImmediate (se va executa în faza check)

Event Loop permite Node.js să proceseze eficient multe solicitări paralele fără a crea un fir separat pentru fiecare, asigurând performanță înaltă.