Executando verificação de segurança...
1

O que a maioria dos diagramas de event loop do Node não mostra

Eu compilei o Node.js e o libuv do zero com std::cout e console.log espalhados pelo código pra ver o event loop funcionando. O que eu vi não bate com o que a maioria dos tutoriais ensina.

O que está errado nos diagramas

Você provavelmente já viu aquele diagrama com uma fila de eventos, uma call stack e setas girando. O Bert Belder - cofundador do libuv - corrigiu isso numa palestra de 2017 que até hoje é a melhor referência que eu conheço sobre o assunto: https://www.youtube.com/watch?v=PNa9OMajw9w

Diagrama simplificado do event loop que a maioria dos artigos ensina

Três coisas que ele corrige e que eu confirmei no código:

O event loop tem fases distintas que executam em ordem fixa: Timers, I/O (o Belder chama de "Unicorn"), setImmediate (check handlers) e Close handlers. Não é uma fila genérica.

Operações de rede não passam pelo thread pool. Vão direto pro kernel via epoll (Linux) ou kqueue (macOS). O thread pool (4 threads por padrão) é só pra file system e DNS. Muita gente acha que tudo passa pelo thread pool.

E a parte que ninguém mostra nos diagramas: entre cada fase, código JavaScript roda. O Node drena as microtasks do V8 (Promises resolvidas) e os callbacks de process.nextTick entre cada fase do libuv. O libuv não sabe nada sobre microtasks - isso é conceito do V8. O Node é quem costura os dois mundos. Sem entender essa costura, os diagramas bonitos te enganam.

Diagrama real do event loop com as fases e microtasks entre cada fase

Vendo no código

Eu enfiei std::cout no C++ e console.log no JavaScript interno do Node pra rastrear o fluxo. No post completo tem os trechos de código, mas o resumo é: dá pra ver exatamente o momento em que o Node drena as microtasks entre cada fase do libuv.

Um detalhe que me surpreendeu: process.nextTick não roda no "próximo tick" - roda no tick atual. O nome mente. E se você agendar um nextTick dentro de outro, ele entra na mesma fila que tá sendo drenada naquele momento. O setImmediate fica esperando.

Quer reproduzir?

Clona o repositório do Node, compila, e coloca print onde quiser. Não precisa de nada especial. O código é mais legível do que parece. Meu branch com os experimentos: https://github.com/geeksilva97/node/tree/playing-with-node

Executando o script no Node compilado - nesteTick callbacks executam antes do setImmediate

O post completo com mais trechos de C++ e a história do process.nesteTick (sim, eu "corrigi" o nome do nextTick com português kkkk): https://codesilva.com/nodejs/2026/03/20/o-event-loop-do-node-nao-e-o-que-te-ensinaram

Carregando publicação patrocinada...
0