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 կոդի կատարման համար։