我正在尝试创建一个集群来在 CPU 之间传播散列,当第一个响应时,找到散列返回供我使用并杀死所有其他工作人员的那个。
我通过创建集群并运行函数来开始我的代码,然后将“发送”添加回主服务器,然后尝试添加逻辑来杀死所有工作人员,
我已阅读文档 Killing node.js workers after function is done作为引用,但它似乎不起作用 - 我可以看到 Node 操作仍在后台运行(在 2 核机器上)使用大量 CPU,然后即使 Node 进程是,我也会得到一些控制台日志完成并返回 bash 终端。
我一生都无法弄清楚我哪里出错了,因此我们将不胜感激。
我目前的代码是:
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
let worker = cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
for (var id in cluster.workers) {
cluster.workers[id].kill();
}
process.exit(0);
});
function messageHandler(msg) {
console.log(msg);
if (msg.hash.length > 1) {
console.log(msg.hash);
}
}
for (const id in cluster.workers) {
cluster.workers[id].on('message', messageHandler);
}
} else {
console.log(`Worker ${process.pid} started and finished`)
console.log(parseInt(cluster.worker.id));
let difficulty = 5;
i = cluster.worker.id;
var start = new Date();
var hrstart = process.hrtime();
hash = computeHash(index, lasthash, timestamp, data, i);
while (hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
hash = computeHash(index, lasthash, timestamp, data, i);
i = i + cluster.worker.id;
}
var end = new Date() - start,
hrend = process.hrtime(hrstart);
console.info('Execution time (hr): %ds %dms', hrend[0], hrend[1] / 1000000)
console.log("Hash found from: " + i);
process.send({
hash: hash
});
process.exit(0);
}
最佳答案
好的,所以我设法以一种非常老套的方式解决了这个问题。我在 Windows 上发现其他地方提供的答案确实有效(即):
for (var id in cluster.workers) {
cluster.workers[id].kill();
}
但是在 Linux 上,即使您终止了 master,您仍然可以运行该进程。如果你像我一样对你的 child 使用阻塞代码,它就不起作用(无论出于何种原因,我也无法在函数中添加超时)。我解决这个问题的方法是在循环中获取所有剩余工作人员及其 pid 的列表,和以前一样,只有这次使用 process.kill 和剩余工作人员的 pid(就像这样:)
for (var id in cluster.workers) {
console.log("Killing remaining processes");
let process_id = cluster.workers[id].process.pid;
process.kill(process_id);
}
这个解决方案很老套,但它很有效,而且那里的例子非常有限,所以我希望这可以帮助别人。
关于javascript - 操作完成后杀死所有 Node 集群工作人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65190402/