В Node.js есть несколько способов разделить выполнение функции на разные ядра процессора для достижения параллельной обработки. Рассмотрим два основных подхода:
1. Модуль cluster:
Модуль cluster предоставляет простой способ создания многопроцессорных приложений в Node.js. Этот модуль позволяет создавать отдельные рабочие процессы, называемые воркерами, которые могут выполнять код параллельно. Мастер-процесс слушает входящие подключения и распределяет их на воркер-процессы.
Вот простой пример использования модуля cluster:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(Master ${process.pid} is running
);
// Fork workers
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(worker ${worker.process.pid} died
);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello Worldn');
}).listen(8000);
console.log(Worker ${process.pid} started
);
}
В данном примере создается мастер-процесс, который создает несколько воркеров (по количеству доступных ядер процессора) и слушает входящие запросы на порту 8000. Каждый воркер запускает HTTP-сервер и обрабатывает входящие запросы независимо от других воркеров. Когда один из воркеров завершает работу, мастер-процесс создает новый воркер для замены.
2. Web Worker Threads:
Web Worker Threads – это пакет Node.js, который позволяет создавать отдельные потоки для обработки задач. Он предоставляет фоновые потоки, которые могут выполняться параллельно с основным потоком Node.js.
Вот пример использования пакета webworker-threads:
const Worker = require('webworker-threads').Worker;
const worker = new Worker(function () {
this.onmessage = function (event) {
// Работаем с данными, полученными от основного потока
var result = doSomeTask(event.data);
// Отправляем результат обратно в основной поток
postMessage(result);
};
});
worker.onmessage = function (event) {
// Обрабатываем результат, полученный от воркера
console.log(event.data);
};
// Отправляем данные в воркер для обработки
worker.postMessage(someData);
В этом примере создается новый воркер с помощью конструктора Worker. Воркер принимает функцию-обработчик, которая выполняется в отдельном потоке. Функция-обработчик ожидает сообщения от главного потока, обрабатывает их и отправляет результат обратно в главный поток.
Выбор подхода для параллельного выполнения функции в Node.js зависит от конкретной задачи и требований проекта. Модуль cluster обычно используется для создания высоконагруженных веб-приложений или для распределения вычислительных задач на несколько ядер процессора. Пакет webworker-threads полезен при выполнении длительных вычислений, которые могут заблокировать основной поток Node.js.