Comprendiendo el Event Loop de Node.js
El Event Loop no es un trabajador. Es un coordinador.
Muchos desarrolladores encuentran el Event Loop complejo. La dificultad suele provenir de mezclar demasiados conceptos a la vez. Tienes que rastrear libuv, el Call Stack, las Promises y la I/O, todo al mismo tiempo.
Esta es la verdad simple. El Event Loop programa el trabajo. No realiza el trabajo.
JavaScript se ejecuta en un solo hilo. Esto significa que el código se ejecuta en línea recta. Una tarea debe terminar antes de que comience la siguiente. Necesitamos un sistema para gestionar tareas asíncronas, como la lectura de archivos o las solicitudes de red, sin detener todo el programa.
Cómo funciona:
El Event Loop mueve los callbacks de diferentes colas al Call Stack. Imagina cada fase como una fila. El Event Loop es la persona que mueve a la gente de la fila hacia la habitación.
Las fases principales son:
- Timers: Gestiona los callbacks de setTimeout y setInterval.
- Pending Callbacks: Gestiona errores específicos del sistema como errores TCP.
- Idle and Prepare: Fases internas utilizadas por libuv. No las utilizarás.
- Poll: La fase más importante. Recupera nuevos eventos de I/O como lecturas de archivos o solicitudes HTTP.
- Check: Gestiona los callbacks de setImmediate.
- Close Callbacks: Gestiona eventos de cierre como el cierre de sockets.
Un error común es pensar que el Event Loop tiene su propio Call Stack. No es así. El runtime tiene un único Call Stack y una microtask queue.
El proceso sigue este flujo:
- El Event Loop elige un callback de la fase actual.
- Lo introduce en el Call Stack.
- El Call Stack ejecuta el código.
- Una vez que el callback termina, el motor vacía la microtask queue. Aquí es donde viven las Promises y el async/await.
- El Event Loop pasa a la siguiente fase.
Si usas setTimeout(..., 0), va a la fase de Timers. Si usas setImmediate(...), va a la fase de Check.
El trabajo pesado ocurre en el kernel del SO y en libuv. El Event Loop simplemente le dice a JavaScript cuándo es el momento de reaccionar.
Fuente: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a