Middle+
Come funziona il ciclo degli eventi (Event Loop) in Node.js?
sobes.tech AI
Risposta dell'AI
Event Loop — è un meccanismo che consente a Node.js di eseguire operazioni di I/O non bloccanti, nonostante JavaScript sia un linguaggio a thread singolo. L'Event Loop monitora continuamente lo stack delle chiamate, la coda dei callback e varie code di eventi (timer, I/O).
Fasi principali dell'Event Loop:
- timers: Esegue i callback pianificati con
setTimeout()esetInterval(). - pending callbacks: Esegue i callback delle operazioni di input/output di sistema (ad esempio, errori di rete), ritardati fino alla prossima iterazione dell'Event Loop.
- idle, prepare: Fasi interne dell'Event Loop.
- poll:
- Calcola quanto tempo bloccare e interrogare le operazioni di input/output.
- Gestisce gli eventi nella coda dei callback I/O quando raggiungono un limite o il tempo scade.
- check: Esegue i callback pianificati con
setImmediate(). - close callbacks: Esegue i callback di chiusura, ad esempio
socket.destroy().
process.nextTick() e le microtask (promesse, queueMicrotask()) vengono eseguite tra le fasi dell'Event Loop e prima di passare alla fase successiva o di terminare quella corrente. process.nextTick() ha priorità più alta rispetto alle microtask.
// Esempi di pianificazione di task
console.log('Inizio');
setTimeout(() => {
console.log('Timer 0');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
process.nextTick(() => {
console.log('nextTick');
});
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('Fine');
// Ordine di esecuzione tipico (può variare a seconda della versione di Node.js e del carico):
// Inizio
// Fine
// nextTick
// Promise
// Timer 0 (eseguito nella fase timers)
// setImmediate (eseguito nella fase check)
L'Event Loop permette a Node.js di gestire in modo efficiente molte richieste parallele senza creare un thread separato per ciascuna, garantendo alte prestazioni.