我正在尝试创建一个集群来在 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);}
1 回答
达令说
TA贡献1821条经验 获得超6个赞
好吧,我设法以一种相当古怪的方式解决了这个问题。我发现在 Windows 上其他地方提供的答案确实有效(即):
for (var id in cluster.workers) {
cluster.workers[id].kill();
}
然而在 Linux 上,即使终止 master,进程仍然会运行。如果您像我一样并且对您的孩子使用阻止代码,则它将不起作用(无论出于何种原因,我也无法在函数中添加超时)。
我解决这个问题的方法是获取循环内所有剩余工作人员及其 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);
}
这个解决方案很hacky,但它有效,而且例子非常有限,所以我希望这可以帮助别人。
添加回答
举报
0/150
提交
取消