Middle+
Kuidas rakendub mitmetöötlus Node.js-is?
sobes.tech AI
Vastus AI-lt
Node.js on oma loomult üheni, mis on mõeldud kasutaja JavaScript-koodi täitmiseks. Mitme ülesande täitmine saavutatakse mitteblokeeriva sisendi/väljundi ja Event Loopi abil. Raskete ülesannete täitmiseks mitme niidiga rakendatakse worker_threads moodulit.
Event Loop:
- Peamine mehhanism asünkroonsete operatsioonide jaoks.
- Üheniidiline tsükkel, mis töötleb I/O operatsioonidega seotud tagasikutsumisi, ajastajaid ja teisi asünkroonseid sündmusi.
Worker Threads:
- Võimaldavad paralleelselt täita CPU-põhiseid raskemaid ülesandeid.
- Iga töötaja käivitab oma V8 JavaScripti mootori eraldi niidil.
- Suhtlus peamise niidi ja töötajate vahel toimub sõnumite vahetamise kaudu (postMessage, receiveMessage).
Võrdlus:
| Mehaanism | Otstarve | Paralleelsus | Seisundite isolatsioon | Mälu kasutus | Keerukus | Paremini sobivaks |
|---|---|---|---|---|---|---|
| Event Loop | Asünkroonne I/O | Konkurentsivõime | Ühine seisund | Tõhusalt | Madal | I/O-põhised ülesanded |
| Worker Threads | CPU-põhised arvutused | Paralleelsus | Isoleeritud | Rohkem | Keskmine | CPU-põhised ülesanded |
Näide worker_threads kasutamisest:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// See on peamine niit
const worker = new Worker(__filename); // Loome töötaja sama faili kasutades
worker.on('message', (msg) => {
console.log(`Töötajalt sõnum: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Töötaja lõpetas koodiga ${code}`);
});
worker.postMessage('Tere, töötaja!'); // Saadame sõnumi töötajale
} else {
// See on töötaja niit
parentPort.on('message', (msg) => {
console.log(`Peamise niidi sõnum: ${msg}`);
parentPort.postMessage('Tere, peamine niit!'); // Saadame sõnumi tagasi
});
}
Event Loop juhitakse Node.js ja libuv tasemel, samas kui worker_threads pakub API, et luua ja hallata niite JavaScripti koodi täitmiseks.