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

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

}


慕的地8271018
浏览 89回答 1
1回答

达令说

好吧,我设法以一种相当古怪的方式解决了这个问题。我发现在 Windows 上其他地方提供的答案确实有效(即):for (var id in cluster.workers) {&nbsp; &nbsp; cluster.workers[id].kill();&nbsp;}然而在 Linux 上,即使终止 master,进程仍然会运行。如果您像我一样并且对您的孩子使用阻止代码,则它将不起作用(无论出于何种原因,我也无法在函数中添加超时)。我解决这个问题的方法是获取循环内所有剩余工作人员及其 pid 的列表,就像以前一样,只是这次使用 process.kill 和剩余工作人员的 pid (如下所示:)&nbsp; for (var id in cluster.workers) {&nbsp; &nbsp;console.log("Killing remaining processes");&nbsp; &nbsp;let process_id = cluster.workers[id].process.pid;&nbsp; &nbsp;process.kill(process_id);&nbsp;}这个解决方案很hacky,但它有效,而且例子非常有限,所以我希望这可以帮助别人。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript