Sobes.tech
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.