Sobes.tech
Middle+

Como é implementada a multitarefa no Node.js?

sobes.tech IA

Resposta da IA

O Node.js é inerentemente single-thread para executar código JavaScript do utilizador. A multitarefa é alcançada através de entrada/saída não bloqueante e do Event Loop. A multitarefa para tarefas pesadas é implementada com o módulo worker_threads.

Event Loop:

  • Mecanismo principal para operações assíncronas.
  • Ciclo de um único thread que processa callbacks relacionados com operações I/O, temporizadores e outros eventos assíncronos.

Worker Threads:

  • Permitem executar tarefas pesadas CPU-bound em paralelo.
  • Cada worker inicia seu próprio motor JS V8 num thread separado.
  • A comunicação entre o thread principal e os workers é feita através do envio de mensagens (postMessage, receiveMessage).

Comparação:

Mecanismo Propósito Paralelismo Isolamento de estados Uso de memória Complexidade Melhor para
Event Loop I/O assíncrono Competição Estado compartilhado Eficiente Baixa Tarefas I/O-bound
Worker Threads Cálculos CPU-bound Paralelismo Isolamento completo Maior Médio Tarefas CPU-bound

Exemplo de uso de worker_threads:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Este é o thread principal
  const worker = new Worker(__filename); // Criar um worker usando o mesmo arquivo

  worker.on('message', (msg) => {
    console.log(`Mensagem do worker: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`O worker terminou com o código ${code}`);
  });

  worker.postMessage('Olá, worker!'); // Enviar mensagem ao worker

} else {
  // Este é o thread do worker
  parentPort.on('message', (msg) => {
    console.log(`Mensagem do thread principal: ${msg}`);
    parentPort.postMessage('Olá, thread principal!'); // Enviar resposta
  });
}

O Event Loop é gerido ao nível do Node.js e libuv, enquanto que os worker_threads fornecem uma API para criar e gerir explicitamente threads para executar código JavaScript.