NodeJS process.send停止工作

时间:2011-12-29 15:05:34

标签: node.js cluster-computing

我正在尝试使用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

1 个答案:

答案 0 :(得分:4)

您的问题是使用阻止事件循环的while(true)。你永远不应该再次使用这样的东西了。相反,您应该使用setTimeoutprocess.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);
}