Node.js Event Loop Explicat: El Secret de la seva Velocitat

Per què Node.js és ràpid tot i ser single thread? Expliquem l'Event Loop, les seves fases i com Libuv i el Worker Pool aconsegueixen l'eficiència.

sábado, 18 de julio de 2026 • 6 min de lectura • Equip Q2BSTUDIO

L'Event Loop de Node.js: Fases i Funcionament

Des de fa anys, quan un desenvolupador escolta que Node.js és ràpid tot i executar-se en un sol fil, sol pensar en el famós Event Loop. Però la majoria de les explicacions es queden en un diagrama de sis fases i no aprofundeixen en per què aquest mecanisme permet manejar milers de connexions simultànies sense consumir recursos excessius. Per entendre-ho de veritat, cal desmuntar el mite que Node.js és màgic i revelar com col·laboren el motor V8, la llibreria Libuv, el sistema operatiu i el Worker Pool. Vam construir una visió completa des de zero, pensant en com aquest coneixement impacta en el desenvolupament d'aplicacions a mida i en l'arquitectura de sistemes moderns.

La filosofia central de Node.js es pot resumir en dues paraules: no esperar. En un servidor tradicional basat en fils, cada petició bloqueja un fil mentre es realitza una operació d'entrada/sortida, com llegir un arxiu o consultar una base de dades. Node.js, en canvi, delega aquestes tasques pesades a altres actors i continua atenent noves sol·licituds. Imagina que l'Event Loop és el director d'una orquestra que no toca cap instrument, però sap exactament quan cada músic ha d'entrar. Si el director es posés a tocar el violí, l'orquestra es pararia. Per això Node.js separa l'execució del codi JavaScript de les operacions lentes, confiant en Libuv per gestionar els detalls de baix nivell.

Per comprendre l'arquitectura, hem de situar cada peça. V8 és el motor que compila JavaScript a codi màquina i l'executa. Libuv és una biblioteca escrita en C/C++ que proporciona el bucle d'esdeveniments, el Worker Pool i l'abstracció per a operacions asincròniques del sistema operatiu. L'Event Loop és el cor de Libuv: un bucle infinit que recorre sis fases en ordre estricte. La primera fase són els timers: aquí s'executen els callbacks de setTimeout i setInterval que han vençut. Després venen els pending callbacks, on es processen esdeveniments del sistema que no van poder manejar-se abans, com certs errors de xarxa. La tercera fase és idle/prepare, una etapa interna de manteniment que no veiem. La quarta, el poll, és la més important: aquí l'Event Loop es queda esperant nous esdeveniments d'entrada/sortida, com l'arribada d'una resposta HTTP o la finalització d'una lectura d'arxiu. És en aquesta fase on Node.js pot dormir sense consumir CPU, gràcies a mecanismes del sistema operatiu com epoll a Linux, kqueue en macOS o IOCP a Windows. La cinquena fase, check, executa els callbacks de setImmediate. La sisena i última, close callbacks, maneja els esdeveniments de tancament de recursos com sockets o streams.

Una de les preguntes més freqüents entre equips que desenvolupen programari a mida és: què passa si no hi ha peticions? L'Event Loop no dona voltes buides cremant CPU. Quan arriba al poll i no hi ha feina, calcula si hi ha algun timer pendent. Si n'hi ha, li demana al sistema operatiu que el desperti quan aquest timer expiri. Si no hi ha timers, li demana que el desperti només quan passi un nou esdeveniment. Així, un servidor Node.js inactiu consumeix pràcticament zero CPU. Això és possible perquè l'espera la fa el sistema operatiu, no el bucle de JavaScript. Aquesta eficiència és crítica per a aplicacions que han d'escalar sense gastar recursos innecessaris, una cosa que valorem molt en Q2BSTUDIO quan dissenyem arquitectures per a clients que necessiten aplicacions a mida amb alta concurrència.

Un altre aspecte que sol generar confusió és la fase de pending callbacks. No és un simple gestor d'errors. Imagina que el sistema operatiu reporta un esdeveniment de xarxa mentre el motor V8 està executant JavaScript. En lloc d' interrompre l' execució, Node.js encola aquest callback i l' executa en aquesta fase, mantenint l' ordre predictible. Això evita condicions de carrera i fa que el comportament sigui determinista, una cosa fonamental en sistemes crítics on la ciberseguretat i la fiabilitat són prioritàries.

El Worker Pool és la peça que completa el trencaclosques. No totes les operacions asincròniques es deleguen al sistema operatiu. Algunes, com la majoria de les operacions d'arxius, criptografia, compressió o certes resolucions DNS, no tenen una interfície nativa asincrònica en tots els sistemes. Libuv llavors utilitza un grup de fils de treball (per defecte 4) per executar aquestes tasques en segon pla. Mentre el Worker Pool treballa, l'Event Loop segueix lliure per atendre altres esdeveniments. Quan la tasca finalitza, s'encola un callback a la cua d'esdeveniments. Aquesta combinació permet que Node.js manegi operacions pesades sense bloquejar el fil principal. És com tenir un equip d'assistents que preparen els ingredients mentre el xef principal s'encarrega d'emplatar. Aquesta arquitectura és ideal per integrar amb ia per a empreses, on els models d' aprenentatge automàtic requereixen processament intensiu, però la interacció amb l' usuari ha de ser fluida.

Tanmateix, hi ha un gran perill: bloquejar l'Event Loop. Si el codi JavaScript realitza un bucle infinit o un càlcul pesant sense delegar, l'Event Loop s'apén. No s' executen timers, no s' atenen peticions, no es processen callbacks. És com si el director de l'orquestra es posés a tocar un sol interminable mentre els músics es queden esperant. Per evitar-ho, és crucial dividir les tasques pesades en fragments més petits o utilitzar el Worker Pool de forma explícita amb funcions com worker_threads. En Q2BSTUDIO, quan desenvolupem programari a mida, apliquem aquestes tècniques per garantir que les aplicacions siguin responsives fins i tot sota càrrega.

En el context empresarial actual, on la transformació digital exigeix sistemes ràpids i escalables, entendre l'Event Loop és vital. No només permet optimitzar el rendiment, sinó també triar les eines adequades. Per exemple, si una aplicació necessita processar arxius grans o executar algoritmes complexos, podem combinar-la amb serveis intel·ligència de negoci que s'executin en paral·lel, mentre Node.js maneja la capa de presentació i les APIs. També és possible integrar agents IA que corrin en processos separats, comunicant-se mitjançant esdeveniments asincrònics. I per a la infraestructura, els serveis cloud aws i azure ofereixen entorns optimitzats per Node.js, amb balancejadors de càrrega i bases de dades gestionades que aprofiten al màxim el model asincrònic.

El veritable secret de la velocitat de Node.js no és un truc de màgia, sinó una arquitectura ben pensada que combina l'eficiència de la programació asincrònica amb la potència del sistema operatiu i el suport de llibreries madures. Cada vegada que un desenvolupador escriu una funció asincrònica, està participant en una coreografia on l'Event Loop, Libuv i el Worker Pool treballen en harmonia. Per a les empreses que busquen solucions modernes, comptar amb un equip que domini aquests conceptes és la diferència entre un sistema que respon en mil·lisegons i un que es cau sota pics de trànsit. En Q2BSTUDIO apliquem aquest coneixement en cada projecte, oferint aplicacions a mida, consultoria en intel·ligència artificial, ciberseguretat i migració al núvol, sempre amb la mirada posada en l'eficiència i l'escalabilitat.

UNA PAUSA?

Juga una estona abans de marxar

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.