Исходный код имеет следующий вид:
const listener = new Listener();
listener.start();
process.on('SIGTERM', () => {
listener.stop();
});
Нужно разделить Listener
на два таким образом, чтобы вынести аналогичную конструкцию в дочерний процесс (чтобы разделить нагрузку между ядрами процессора, например).
Как правильно это сделать средствами Node.js?
1. Разнородные дочерние процессы
Насколько я понял, обработчики дочерних процессов нужно обязательно выносить в отдельные файлы, и другого решения Node.js на сегодняшний день не предлагает:
./index.js
const { fork } = require('child_process');
const processHandlers = [
'./subprocess/process1.js',
'./subprocess/process2.js',
];
const processes = processHandlers.map((h) => fork(h, []));
process.on('SIGTERM', () => {
processes.forEach((process) => process.send('stop'));
});
./subprocess/process1.js
const listener = new Listener1();
listener.start();
process.on('message', (m) => {
if (m === 'stop') {
listener.stop();
process.disconnect();
}
});
./subprocess/process2.js
const listener = new Listener2();
listener.start();
process.on('message', (m) => {
if (m === 'stop') {
listener.stop();
process.disconnect();
}
});
2. Однородные дочерние процессы
В случае, если потомки — однородные конкурирующие вычислительные единицы, можно использовать модуль сluster:
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Обработчик ведущего процесса
// Запуск дочерних процессов
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Обработчик дочерних процессов
console.log(`Worker ${process.pid} started`);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Функция rand() возвращает псевдослучайное число от 0 до 2^31 -1Она никогда не возвращает отрицательные числа, но при этом "ворует" аж половину диапазона...
Мне нужно переместить list в set, я думал что для этого можно использовать функцию copy, но все оказалось не так просто, так как у класса set нету метода...
Есть два потока, когда начинается ввод в одном требуется остановить другой поток, как понять что ввод в первом потоке началсяЕсли использовать: