O que é um Event Loop? Concorrência single-threaded
Um event loop é um mecanismo de runtime que permite a uma única thread lidar com muitas tarefas, retirando repetidamente o próximo evento pronto de uma fila e rodando-o até o fim.
Runtimes como o Node.js e o navegador são single-threaded para o seu código, e ainda assim fazem malabarismo com milhares de conexões de rede sem bloquear. O truque é o event loop: um loop que espera por eventos (um timer disparando, dados chegando, uma promise resolvendo), roda o callback associado e segue em frente. É o motor por trás de async/await e callbacks.
Como o loop roda
O event loop verifica filas de trabalho pendente: callbacks prontos para rodar, timers que expiraram, I/O que completou. Ele pega o próximo, roda-o até o fim e repete. Enquanto um callback roda, nada mais roda, então cada tarefa deve ser curta.
Por que uma thread consegue fazer tanto
A maior parte do trabalho de servidor é I/O-bound: esperar na rede ou no disco. O event loop inicia uma operação de I/O, a entrega ao OS e passa para outro trabalho, voltando ao resultado depois. A espera ociosa nunca bloqueia a thread.
O que bloqueia o loop
- Loops síncronos longos ou computação pesada na main thread.
- Chamadas síncronas de arquivo ou rede que esperam inline.
- Parsing de JSON grande ou crypto feito sem ceder controle.
- Qualquer coisa que não devolva o controle rapidamente ao loop.
O perigo de bloquear
Como tudo compartilha uma thread, uma única tarefa síncrona lenta congela o programa inteiro: nenhum outro callback roda, nenhum request é atendido. Manter o trabalho assíncrono ou passar tarefas CPU-heavy para workers mantém o loop responsivo.
Um exemplo rápido
Um setTimeout(fn, 0) não roda fn imediatamente; ele enfileira fn para rodar em uma volta posterior do event loop, depois de o código síncrono atual terminar.
O event loop no CI
Test runners em runtimes com event loop podem travar se uma promise nunca resolve ou um handle fica aberto, estagnando o job até o timeout. A Latchkey impõe timeouts de job para que um event loop preso seja cortado prontamente, e dá retry apenas em falhas que parecem genuinamente transitórias.
Principais conclusões
- Um event loop permite a uma thread lidar com muitas tarefas processando eventos de uma fila.
- Ele se destaca em trabalho I/O-bound por nunca bloquear em esperas ociosas.
- Trabalho síncrono pesado bloqueia o loop e congela o programa inteiro.