Middle+
Kako se implementira višestruko izvršavanje u Node.js?
sobes.tech АИ
Одговор од АИ
Node.js je po svojoj prirodi jednonitni za izvršavanje korisničkog JavaScript koda. Višezadaćnost se postiže putem neblokirajućeg ulaza/izlaza i Event Loop-a. Višestruko niti za izvršavanje teških zadataka implementira se pomoću modula worker_threads.
Event Loop:
- Glavni mehanizam za asinhrone operacije.
- Jednonitni ciklus koji obrađuje callback-ove povezane sa I/O operacijama, tajmerima i drugim asinhronim događajima.
Worker Threads:
- Omogućavaju paralelno izvršavanje teških CPU-bound zadataka.
- Svaki radnik pokreće svoj sopstveni V8 JavaScript motor u zasebnoj niti.
- Komunikacija između glavne niti i radnika odvija se putem razmene poruka (postMessage, receiveMessage).
Poređenje:
| Mehanizam | Namenjeno | Pararelizam | Izolacija stanja | Upotreba memorije | Složenost | Bolje za |
|---|---|---|---|---|---|---|
| Event Loop | Asinhroni I/O | Konkurentnost | Zajedničko stanje | Efikasno | Niska | I/O-bound zadaci |
| Worker Threads | CPU-bound izračuni | Pararelizam | Izolovano | Više | Srednja | CPU-bound zadaci |
Primer korišćenja worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Ovo je glavna nit
const worker = new Worker(__filename); // Kreira radnika koristeći istu datoteku
worker.on('message', (msg) => {
console.log(`Poruka od radnika: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Radnik je završio sa kodom ${code}`);
});
worker.postMessage('Zdravo, radniče!'); // Šalje poruku radniku
} else {
// Ovo je radnička nit
parentPort.on('message', (msg) => {
console.log(`Poruka od glavne niti: ${msg}`);
parentPort.postMessage('Zdravo, glavna nit!'); // Šalje poruku nazad
});
}
Event Loop se upravlja na nivou Node.js i libuv, dok worker_threads pružaju API za eksplicitno kreiranje i upravljanje nitima za izvršavanje JavaScript koda.