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