Middle+
Jak je implementována vícenásobnost v Node.js?
sobes.tech AI
Odpověď od AI
Node.js je přirozeně jednovláknové prostředí pro spouštění uživatelského JavaScriptového kódu. Víceúlohovost je dosažena pomocí neblokujícího vstupu/výstupu a Event Loop. Vícevláknové zpracování těžkých úloh je realizováno pomocí modulu worker_threads.
Event Loop:
- Hlavní mechanismus pro asynchronní operace.
- Jednovlákní cyklus, který zpracovává callbacky související s I/O operacemi, časovači a dalšími asynchronními událostmi.
Worker Threads:
- Umožňují paralelní vykonávání těžkých CPU-bound úloh.
- Každý worker spouští svůj vlastní V8 JavaScript engine v samostatném vlákně.
- Komunikace mezi hlavním vláknem a workery probíhá prostřednictvím posílání zpráv (postMessage, receiveMessage).
Porovnání:
| Mechanismus | Účel | Paralelismus | Izolace stavů | Použití paměti | Složitost | Vhodné pro |
|---|---|---|---|---|---|---|
| Event Loop | Asynchronní I/O | Konkurenční | Sdílený stav | Efektivní | Nízká | I/O-vázané úlohy |
| Worker Threads | CPU-vázané výpočty | Paralelní | Izolované | Vyšší | Střední | CPU-vázané úlohy |
Příklad použití worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Hlavní vlákno
const worker = new Worker(__filename); // Vytvoření workeru se stejným souborem
worker.on('message', (msg) => {
console.log(`Zpráva od workeru: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Worker skončil s kódem ${code}`);
});
worker.postMessage('Ahoj, worker!'); // Odeslání zprávy workeru
} else {
// Worker thread
parentPort.on('message', (msg) => {
console.log(`Zpráva od hlavního vlákna: ${msg}`);
parentPort.postMessage('Ahoj, hlavní vlákno!'); // Odeslání odpovědi
});
}
Event Loop je řízen na úrovni Node.js a libuv, zatímco worker_threads poskytují API pro explicitní vytváření a správu vláken pro vykonávání JavaScriptového kódu.