Sobes.tech
Middle+

როგორ ხორციელდება მრავალმხრივი მუშაობა Node.js-ში?

sobes.tech AI

პასუხი AI-სგან

Node.js իր բնույթով միապարամետր է օգտագործողի JavaScript կոդի կատարման համար։ Շատգործառույթայնությունը հասնում է անբլոկային մուտք/ելք և Event Loop-ի միջոցով։ Մուլտիթրեդների համար ծանր առաջադրանքների կատարման համար իրականացվում է worker_threads մոդուլը։

Event Loop:

  • Հիմնական մեխանիզմը է՝ ասինխրոն գործառույթների համար։
  • Միապարամետր ցիկլ, որը մշակվում է I/O գործողությունների, ժամացույցների և այլ ասինխրոն իրադարձությունների հետ կապված callback-ները։

Worker Threads:

  • Позволяют выполнять параллельно тяжелые CPU-bound задачи.
  • Каждый воркер запускает свой собственный V8 JavaScript շարժիչը առանձին հոսքում։
  • Հաղորդակցությունը հիմնական հոսքի և աշխատողների միջև տեղի է ունենում հաղորդագրությունների փոխանակման միջոցով (postMessage, receiveMessage):

Համեմատություն:

Մեխանիզմ Նպատակը Պարալելիզմը Ստեղծվածության վիճակները Հիշողության օգտագործում Կարծրություն Ավելի հարմար է՝
Event Loop Ասինխրոն I/O Կոնկուրսենտություն Ընդհանուր վիճակ Փոխարժեքային Նվազագույն I/O-կապված առաջադրանքներ
Worker Threads CPU-կապված հաշվարկներ Պարալելիզմ Բաժանված Ավելի Միջին CPU-կապված առաջադրանքներ

Օրինակ worker_threads-ի օգտագործման:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Սա հիմնական հոսքն է
  const worker = new Worker(__filename); // Ստեղծում ենք աշխատող՝ նույն ֆայլից

  worker.on('message', (msg) => {
    console.log(`Հաղորդագրություն աշխատակիցից: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Աշխատողը ավարտվեց կոդով ${code}`);
  });

  worker.postMessage('Բարև, աշխատող!'); // Ուղարկում ենք հաղորդագրություն աշխատողին

} else {
  // Սա աշխատողի հոսքն է
  parentPort.on('message', (msg) => {
    console.log(`Հաղորդագրություն հիմնական հոսքից: ${msg}`);
    parentPort.postMessage('Բարև, հիմնական հոսք!'); // Ուղարկում ենք հաղորդագրություն հետ
  });
}

Event Loop-ը կառավարում է Node.js և libuv մակարդակով, մինչդեռ worker_threads-ը տրամադրում է API՝ հստակ ստեղծելու և կառավարելու հոսքերը JavaScript կոդի կատարման համար։