Middle+
Hogyan valósul meg a több szálú végrehajtás a Node.js-ben?
sobes.tech MI
Válasz az MI-től
A Node.js eredendően egy szálon futó környezet, amely felhasználói JavaScript-kód végrehajtására szolgál. A multitasking nem blokkoló bemenet/kimenet és az Event Loop segítségével valósul meg. A nehéz feladatok párhuzamos végrehajtása a worker_threads modul segítségével valósítható meg.
Event Loop:
- A fő mechanizmus az aszinkron műveletekhez.
- Egy egy szálon futó ciklus, amely az I/O műveletekkel, időzítőkkel és más aszinkron eseményekkel kapcsolatos callbackeket kezeli.
Worker Threads:
- Lehetővé teszik a CPU-kötött nehéz feladatok párhuzamos végrehajtását.
- Minden worker saját V8 JavaScript motorját indítja el külön szálon.
- A fő szál és a worker-ek közötti kommunikáció üzenetküldésen keresztül történik (postMessage, receiveMessage).
Összehasonlítás:
| Mechanizmus | Cél | Párhuzamosság | Állapot izoláció | Memóriahasználat | Komplexitás | Jobb alkalmazási terület |
|---|---|---|---|---|---|---|
| Event Loop | Aszinkron I/O | Versengés | Megosztott állapot | Hatékony | Alacsony | I/O-kötött feladatok |
| Worker Threads | CPU-kötött számítások | Párhuzamosság | Elkülönített | Magasabb | Közepes | CPU-kötött feladatok |
Példa a worker_threads használatára:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Ez a fő szál
const worker = new Worker(__filename); // Worker létrehozása ugyanazzal a fájllal
worker.on('message', (msg) => {
console.log(`Üzenet a workertől: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`A worker befejeződött a következő kóddal: ${code}`);
});
worker.postMessage('Szia, worker!'); // Üzenet küldése a workernek
} else {
// Ez a worker szál
parentPort.on('message', (msg) => {
console.log(`Üzenet a fő szálról: ${msg}`);
parentPort.postMessage('Szia, fő szál!'); // Válasz küldése
});
}
Az Event Loop a Node.js és a libuv szintjén van kezelve, míg a worker_threads API-k lehetővé teszik a szálak explicit létrehozását és kezelését JavaScript kód végrehajtásához.