Middle+
Ako sa implementuje viacvláknové spracovanie v Node.js?
sobes.tech AI
Odpoveď od AI
Node.js je svojou podstatou jednobodový na vykonávanie používateľského JavaScript kódu. Viacnásobné úlohy sa dosahujú pomocou neblokujúceho vstupu/výstupu a Event Loop. Viacvláknové spracovanie náročných úloh je implementované pomocou modulu worker_threads.
Event Loop:
- Hlavný mechanizmus pre asynchrónne operácie.
- Jednoduchý cyklus, ktorý spracováva callbacky spojené s I/O operáciami, časovačmi a inými asynchrónnymi udalosťami.
Worker Threads:
- Umožňujú paralelné vykonávanie ťažkých CPU-bound úloh.
- Každý pracovník spúšťa vlastný V8 JavaScript motor v samostatnej vlákne.
- Komunikácia medzi hlavným vláknom a pracovníkmi prebieha prostredníctvom výmeny správ (postMessage, receiveMessage).
Porovnanie:
| Mechanizmus | Účel | Paralelizmus | Izolácia stavov | Použitie pamäte | Zložitosť | Lepšie pre |
|---|---|---|---|---|---|---|
| Event Loop | Asynchrónne I/O | Súbežnosť | Spoločný stav | Efektívne | Nízka | I/O-bound úlohy |
| Worker Threads | CPU-bound výpočty | Paralelizmus | Izolované | Viac | Stredná | CPU-bound úlohy |
Príklad použitia worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Toto je hlavný vlákno
const worker = new Worker(__filename); // Vytvárame pracovníka s použitím toho istého súboru
worker.on('message', (msg) => {
console.log(`Správa od pracovníka: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Pracovník skončil s kódom ${code}`);
});
worker.postMessage('Ahoj, pracovník!'); // Posielame správu pracovníkovi
} else {
// Toto je pracovné vlákno
parentPort.on('message', (msg) => {
console.log(`Správa od hlavného vlákna: ${msg}`);
parentPort.postMessage('Ahoj, hlavné vlákno!'); // Posielame správu späť
});
}
Event Loop je riadený na úrovni Node.js a libuv, zatiaľ čo worker_threads poskytujú API na explicitné vytváranie a správu vlákien na vykonávanie JavaScript kódu.