Sobes.tech
Middle+

Kaip įgyvendinama daugiagijybė Node.js?

sobes.tech AI

Atsakymas iš AI

Node.js savo prigimtimi yra viengubas siūlas, skirtas vykdyti vartotojo JavaScript kodą. Daugybinė užduočių vykdymas pasiekiamas naudojant neblokuojantį įvesties/išvesties ir Event Loop. Daugiatiklių vykdymas sudėtingoms užduotims įgyvendinamas naudojant worker_threads modulį.

Event Loop:

  • Pagrindinis mechanizmas asinchroninėms operacijoms.
  • Viengubas ciklas, kuris apdoroja callback'us, susijusius su I/O operacijomis, laikmačiais ir kitais asinchroniniais įvykiais.

Worker Threads:

  • Leidžia vykdyti lygiagrečiai sudėtingas CPU-bound užduotis.
  • Kiekvienas darbininkas paleidžia savo V8 JavaScript variklį atskiroje gijoje.
  • Sąveika tarp pagrindinės gijos ir darbininkų vyksta per žinučių keitimą (postMessage, receiveMessage).

Palyginimas:

Mechanizmas Paskirtis Paralelelis Būsenų izoliacija Atminties naudojimas Sudėtingumas Geriausiai tinka
Event Loop Asinchroninis I/O Konkurencija Bendra būsena Efektyvu Mažas I/O-ryšių užduotys
Worker Threads CPU-bound skaičiavimai Paralelelis Izoliuotas Daugiau Vidutinis CPU-bound užduotys

Pavyzdys naudojant worker_threads:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Tai pagrindinė gija
  const worker = new Worker(__filename); // Sukuriame darbininką naudodami tą patį failą

  worker.on('message', (msg) => {
    console.log(`Pranešimas iš darbininko: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Darbininkas baigėsi su kodu ${code}`);
  });

  worker.postMessage('Sveikas, darbininke!'); // Siunčiame žinutę darbininkui

} else {
  // Tai darbininko gija
  parentPort.on('message', (msg) => {
    console.log(`Pranešimas iš pagrindinės gijos: ${msg}`);
    parentPort.postMessage('Sveikas, pagrindinė gija!'); // Siunčiame žinutę atgal
  });
}

Event Loop valdomas Node.js ir libuv lygyje, o worker_threads suteikia API aiškiam gijų kūrimui ir valdymui JavaScript kodo vykdymui.