【发布时间】: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