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.