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

  1. timers: Esegue i callback pianificati con setTimeout() e setInterval().
  2. 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.
  3. idle, prepare: Fasi interne dell'Event Loop.
  4. 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.
  5. check: Esegue i callback pianificati con setImmediate().
  6. 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.