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