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:
- timers: Execută callback-urile programate cu
setTimeout()șisetInterval(). - 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.
- idle, prepare: Fazele interne ale Event Loop.
- 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ă.
- check: Execută callback-urile programate cu
setImmediate(). - 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ă.