【问题标题】:Kill all Node cluster workers once operation is complete操作完成后杀死所有节点集群工作人员
【发布时间】:2020-12-08 21:48:59
【问题描述】:

我正在尝试创建一个集群以在 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);
}

【问题讨论】:

  • 您的工作进程永远不会空闲,这将给它时间来处理信号......
  • 哦,我明白了,因为它处于阻塞状态?有没有办法在不手动终止每个进程的情况下实现我的目标?在这种情况下短时间会起作用吗?
  • 是的,每隔几次迭代(或几百次迭代,取决于computeHash 需要多长时间)应该做短暂的超时
  • 或者,您可以尝试只发送SIGKILL 信号而不是defaultSIGTERM
  • 我不太明白如何使用它,我试图将我的代码更改为'cluster.workers[id].kill('SIGKILL');'但这似乎不起作用。我是否需要单独声明每个工人并设置一个事件从工人端杀死它?

标签: javascript node.js


【解决方案1】:

好的,所以我设法以一种非常老套的方式解决了这个问题。我在 Windows 上发现其他地方提供的答案确实有效(即):

for (var id in cluster.workers) {
    cluster.workers[id].kill();
 }

但是在 Linux 上,即使您终止了主进程,您仍然可以运行该进程。如果你像我一样在你的孩子身上使用阻塞代码,它就行不通(无论出于何种原因,我也无法在函数中添加超时)。

我解决这个问题的方法是在循环中获取所有剩余工作人员及其 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);
 }

这个解决方案很老套,但它很有效,而且那里的例子非常有限,所以我希望这可以帮助别人。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 2020-01-04
    • 2017-03-08
    • 2010-10-22
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多