Skip to content
Latchkey

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.

Guias relacionados