gpt4 book ai didi

node.js - NodeJS 集群模块

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:11 25 4
gpt4 key购买 nike

我正在测试 NodeJS 的集群模块。我正在努力实现以下目标:

  • 启动具有两个集群工作线程的 HTTP 服务器。
  • 一旦master和worker启动,master就会发送一个“check”每 5 秒向工作人员发送一条消息
  • 如果工作人员回复,则计数器设置为 0
  • 如果在下一个“检查”消息之前没有消息,则计数器增加。
  • 我检查工作人员是否在接下来的 20 秒内没有响应我杀死了worker,让master启动一个新的worker。

我面临的问题是:

  • 当我杀死该工作人员时,下一个工作人员会进入重新启动、终止、重新启动、终止等循环,这意味着在任何时间点只有一个工作人员处于事件状态,而另一个工作人员则没有响应,因此它会进入循环。

我的代码是:

var cluster = require('cluster');
var http = require('http');
var numCPUs = 2;
var workerStatus = new Object();

if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}

cluster.on('exit', function(worker, code, signal) {
cluster.fork();
console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code);
});


// Go through all workers
function eachWorker(callback) {
for (var id in cluster.workers) {
callback(cluster.workers[id],id);
}
}
setInterval(function (){
eachWorker(function(worker,id) {
if (workerStatus[id] == undefined) workerStatus[id]=-1;
if (workerStatus[id] < 4){
workerStatus[id]++;
console.log("Message Sent : " + id);
worker.send('check');
}else{
delete workerStatus[id]
console.log("Some Problem with " + id);
worker.disconnect();
worker.kill();
}
});
},5000);

eachWorker(function(worker,id){
var w_id =id;
worker.on('message', function(msg){
workerStatus[w_id]=0;
console.log("Message Received : " + w_id);
});
});

} else {
process.on('message', function(msg) {
process.send(msg);
});

// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
while (1) {}
res.writeHead(200);
res.end("hello world--" + cluster.worker.id);
//cluster.worker.kill();
}).listen(8080);
}

最佳答案

我发现了这个问题。

当我杀死工作人员并启动新工作人员时,我不会为新创建的工作人员添加监听器。因此,新创建的工作线程永远不会收到消息。

只需添加以下代码,问题就得到解决。

cluster.on('exit', function(worker, code, signal) {
var w = cluster.fork();
console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code);
w.on('message', function(msg){
workerStatus[w.id]=0;
console.log("Message Received : " + w.id);
});

});

关于node.js - NodeJS 集群模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23121385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com