Проверяет понимание способов организации параллельного и конкурентного выполнения кода в Node.js, что важно для построения производительных серверных приложений.
Node.js изначально однопоточный в части JavaScript-кода, но предоставляет несколько механизмов для параллельного и конкурентного выполнения. Важно различать конкурентность (одновременная обработка задач через event loop) и параллелизм (реальное выполнение на нескольких ядрах CPU).
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (msg) => console.log('Результат:', msg));
worker.postMessage(40);
} else {
parentPort.on('message', (n) => {
let sum = 0;
for (let i = 0; i < n; i++) sum += i;
parentPort.postMessage(sum);
});
}
const cluster = require('cluster');
const http = require('http');
const os = require('os');
if (cluster.isPrimary) {
os.cpus().forEach(() => cluster.fork());
} else {
http.createServer((req, res) => res.end('ok')).listen(3000);
}
Event loop отлично справляется с I/O, но блокируется синхронными вычислениями. Worker Threads позволяют вынести такие вычисления в отдельный поток, а Cluster — масштабировать приложение на все ядра. child_process полезен для запуска изолированных задач или сторонних программ.
Итог: для сетевых приложений достаточно event loop, для CPU-задач используйте Worker Threads, а для масштабирования на несколько ядер — Cluster.