javascript - 操作完成后杀死所有 Node 集群工作人员

标签 javascript node.js

我正在尝试创建一个集群来在 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/

相关文章:

node.js - React Native 错误 - 找不到变量 : self

javascript - 使用 API 调用创建 yeoman 生成器

node.js - API授权策略

javascript - 改变 :before styling with Javascript

javascript - CasperJS测试执行后不会返回

javascript - 将 jquery 幻灯片效果转换为 mootools

javascript - Node.js 中的大型 CSV 到 JSON/对象

javascript - 当通过键盘选择 `<option>`时如何捕获?

javascript - w/firebase.js 和 Angular UI Router 的问题

node.js - 将上传的文件流式传输到 HTTP 请求