亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

操作完成后殺死所有節點集群工作人員

操作完成后殺死所有節點集群工作人員

慕的地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 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號