O negócio é entender a diferença entre cooperative multitasking e preemptive multitasking. No primeiro, os diversos "atores" precisam cooperar entre si. Isso significa ser um bom cidadão e não tomar todo o "tempo de CPU" para si—periodicamente, você precisa "ceder" o controle.
Há um tempo eu fiz um post mostrando que sua operação sincrona ia travar tua API Node.
Esse é um post mais DEEP sobre esse tema.
Sobre o termo "EventLoop Travar":
O V8 executa os frames de funções referenciadas na CallStack.
Enquanto houver pelo menos um frame ativo na CallStack, o V8 vai estar torando código síncrono e o EventLoop vai ficar afk.
Ele só move essas callback pra CallStack quando a mesma está vazia.
Dependendo da função assíncrona que lida com essa callback ela pode ir pra uma fila diferente:
ex:
setTimeout callback → Macrotask
Promise callback → Microtask
Existe uma prioridade entre essas filas:
Microtasks tem prioridade total sobre Macrotasks.
O Event Loop sempre processa TODAS as Microtasks disponiveis antes de pegar uma unica Macrotask.
ex:
Promises executam antes de setTimeout(fn, 0).
Mas quando essas callbacks vão pra MicrotaskQueue?
No caso das Promises, quando o status muda de pending pra resolved/rejected.
Aí tudo que está dentro do seu .then(callback) ou abaixo do seu await (callbacks via sugar syntax) vai direto pra Microtask Queue.
Enfim:
Enquanto o V8 está torando a CallStack processando seu código síncrono JIT (Just in Time) a callback do seu .then nunca vai ser executada.
Ou aquele codigo que vem abaixo do seu await.
E por tal motivo sua API vai parar de responder geral e seu sistema continuará bronze V.
Oct 31, 2025 · 9:18 PM UTC
