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.