¿Qué es el Event Loop?
El event loop permite a Node.js hacer I/O no bloqueante aunque JavaScript sea de un solo hilo. Las operaciones se delegan al sistema y se ejecutan callbacks cuando terminan.
🔄 Fases del Event Loop
1
Timers - setTimeout y setInterval
2
Pending callbacks - I/O diferido
3
Idle, prepare - uso interno
4
Poll - I/O y callbacks
5
Check - setImmediate
6
Close callbacks - close
Orden de ejecución
console.log('1: inicio');
setTimeout(() => console.log('2: setTimeout'), 0);
setImmediate(() => console.log('3: setImmediate'));
Promise.resolve().then(() => console.log('4: promise'));
process.nextTick(() => console.log('5: nextTick'));
console.log('6: fin');
Microtasks vs Macrotasks
| Microtasks | Macrotasks |
|---|---|
| process.nextTick() | setTimeout() |
| Promise.then() | setInterval() |
| queueMicrotask() | setImmediate() |
| I/O |
Las microtasks se ejecutan al final de cada fase antes de avanzar a la siguiente.
nextTick vs setImmediate
const fs = require('fs');
fs.readFile('file.txt', () => {
setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
});
setTimeout(() => console.log('timeout2'), 0);
setImmediate(() => console.log('immediate2'));
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('promise'));
Bloqueo del event loop
app.get('/slow', (req, res) => {
const start = Date.now();
while (Date.now() - start < 5000) {}
res.send('done');
});
El bucle bloqueante evita que otras requests se atiendan. Para tareas CPU usa workers.
💡 Buenas prácticas
- • Evita loops pesados en el hilo principal
- • Usa streams para I/O eficiente
- • Usa worker threads para CPU intensivo
- • Mide latencias y bloqueos