我正在尝试使用 NodeJS。我遇到以下代码的问题。一段时间后,从集群中的工作 Node 发送到主 Node 的消息似乎不再被处理。
这是 NodeJS 网站上集群示例之一的变体。
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log("Starting cluster ...");
for (var i = 0; i < numCPUs; i++) {
var worker = cluster.fork();
worker.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died. restart...');
cluster.fork();
});
worker.on('message', function(msg) {
if (msg.cmd == 'reached') {
console.log('Worker %d reached another 10000', msg.workerId);
}
});
}
} else {
console.log("Started worker %d ...", process.env.NODE_WORKER_ID);
var i = 0;
while (true) {
if (i++ % 10000 == 9999) {
process.send({ cmd: 'reached' , workerId: process.env.NODE_WORKER_ID });
console.log('haha');
}
}
}
当代码运行时,预期的消息“Worker 1reached another 10000”被很好地打印出来。但仅仅几秒钟后,它就停止了,只打印了 process.send 后面的“haha”。
我做错了什么?
我使用的是 NodeJS 0.6.6
最佳答案
您的问题是使用 while(true)
,它会阻止事件循环。你永远不应该(再次)使用这样的东西。相反,您应该使用 setTimeout
或 process.nextTick
。这是一个完美运行的更正示例:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log("Starting cluster ...");
for (var i = 0; i < numCPUs; i++) {
var worker = cluster.fork();
worker.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died. restart...');
cluster.fork();
});
worker.on('message', function(msg) {
if (msg.cmd == 'reached') {
console.log('Worker %d reached another 10000', msg.workerId);
}
});
}
} else {
console.log("Started worker %d ...", process.env.NODE_WORKER_ID);
function repeatable(i) {
if (i++ % 10000 == 9999) {
process.send({ cmd: 'reached' , workerId: process.env.NODE_WORKER_ID });
console.log('haha');
}
setTimeout(function() {
repeatable(i);
}, 1);
}
var i = 0;
repeatable(i);
}
关于node.js - NodeJS process.send 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669464/