为了账号安全,请及时绑定邮箱和手机立即绑定

操作完成后杀死所有节点集群工作人员

操作完成后杀死所有节点集群工作人员

慕的地8271018 2023-10-20 16:07:31
我正在尝试创建一个集群来在 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,但它有效,而且例子非常有限,所以我希望这可以帮助别人。


查看完整回答
反对 回复 2023-10-20
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信