我正在尝试使用NodeJS。我遇到了以下代码的问题。过了一段时间,从工作人员发送到群集中的主人的消息似乎不再被处理了。
这是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 1到达另一个10000”。但是只过了几秒钟,它就停止了,只打印了process.send之后的“haha”。
我做错了什么?
我正在使用NodeJS 0.6.6
答案 0 :(得分:4)
您的问题是使用阻止事件循环的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);
}