Skip to main content

Thread | Node.js

  • Thread | Node.js
info

O Node executa o código em um único thread, mas pode lidar com operações assíncronas de forma eficiente usando um loop de eventos sem bloqueio.

alt text

Event Loop

O event loop é um mecanismo central em JavaScript e Node.js que gerencia a execução de código assíncrono, operações de I/O, e callbacks. Ele permite que a linguagem opere de forma não bloqueante, mesmo sendo single-threaded.

Como funciona o Event Loop em Node.js

  1. Thread Principal: O Node.js executa JavaScript em uma única thread (a "main thread").
  2. Fila de Eventos: Quando uma operação assíncrona é iniciada (como leitura de arquivos ou uma requisição HTTP), ela é delegada a uma API do sistema operacional ou ao pool de threads.
  3. Conclusão Assíncrona: Após a conclusão da operação assíncrona, a API coloca um callback (função de retorno) na fila de eventos.
  4. Looping: O event loop verifica constantemente se há callbacks na fila de eventos. Quando encontra um, o executa na thread principal.

Fases do Event Loop

  1. Timers: Executa callbacks de funções como setTimeout e setInterval.
  2. I/O Callbacks: Processa callbacks de operações de I/O concluídas.
  3. Idle, Prepare: (usado internamente pelo Node.js).
  4. Poll: Recupera novos eventos de I/O.
  5. Check: Executa callbacks de setImmediate.
  6. Close Callbacks: Lida com callbacks relacionados ao fechamento de conexões (por exemplo, socket.on('close')).

Threads

Enquanto o event loop opera em uma thread única, o Node.js também utiliza threads em segundo plano para tarefas específicas.

Tipos de Threads

  1. Thread Principal: Onde o event loop e o código JavaScript do usuário são executados.

  2. Thread Pool (libuv):

    • O Node.js usa a biblioteca libuv para criar um pool de threads em segundo plano.
    • Esse pool é usado para lidar com tarefas de I/O e CPU intensivas, como:
      • Operações de sistema de arquivos.
      • Resoluções de DNS.
      • Criptografia (ex.: hashing e encriptação).
  3. Worker Threads:

    • Introduzido no Node.js 10.5.0, o módulo worker_threads permite que desenvolvedores criem threads explícitas para executar código JavaScript em paralelo.
    • É útil para processamento intensivo de CPU, como cálculos complexos ou manipulação de dados.

Diferenças entre Event Loop e Threads

CaracterísticaEvent LoopThreads
Modelo de ExecuçãoSingle-threadedMulti-threaded
FinalidadeGerenciar operações assíncronasExecutar tarefas paralelas
Uso em Node.jsSempre ativoOpcional (pool de threads ou workers)
Tarefas AdequadasI/O, timers, eventosProcessamento pesado (CPU-bound)

Exemplo: Event Loop vs Threads

Event Loop:

setTimeout(() => {
console.log("Isso vem da fila de eventos.");
}, 1000);
console.log("Código síncrono executado primeiro.");

Saída:

Código síncrono executado primeiro.
Isso vem da fila de eventos.

Worker Threads:

const { Worker } = require('worker_threads');

const worker = new Worker(`
const { parentPort } = require('worker_threads');
let count = 0;
for (let i = 0; i < 1e9; i++) count++;
parentPort.postMessage(count);
`, { eval: true });

worker.on('message', result => {
console.log(`Resultado do cálculo: ${result}`);
});
console.log("Código principal continua enquanto o worker trabalha.");

Saída:

Código principal continua enquanto o worker trabalha.
Resultado do cálculo: 1000000000

Em resumo:

  • O event loop é ideal para tarefas assíncronas leves e I/O.
  • Threads (via worker_threads ou thread pool) são mais adequadas para tarefas pesadas de CPU. Eles se complementam para maximizar o desempenho em Node.js.

Anotações pessoais

  • Single Thread do node é por conta do event loop, o event loop é um orquestrador de eventos que delega para outras threads do libuv e o event loop que é single thread
  • Nodejs é um controlador, ele pega o script (index.js) manda para v8 e a v8 interpreta ele e retorna
  • Com a libuv a gente delega para o sistema operacional realizar os subprocessos (manipula os eventos)
  • V8 traduz o JS para código de máquina
  • Thread está do lado do C++