【问题标题】:NodeJS process.send stops workingNodeJS process.send 停止工作
【发布时间】:2011-12-29 23:34:53
【问题描述】:

我正在用 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');
        }
    }
}

当代码运行时,预期的消息“工人 1 达到另一个 10000”被很好地打印出来。但仅仅几秒钟后,它就停止了,只打印了 process.send 后面的“哈哈”。

我做错了什么?

我正在使用 NodeJS 0.6.6

【问题讨论】:

    标签: node.js cluster-computing


    【解决方案1】:

    您的问题是使用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);
    }
    

    【讨论】:

    • 我遇到了完全相同的问题,但在我的情况下,while(true) 没有涉及。在向机器发送大量负载(〜5000req / s)之前,一切都运行良好,而不是来自工作人员的消息不再到达主进程。有什么建议吗? :)
    • 我不知道该告诉你什么,你能给我一个代码示例(要点,一些东西)吗?
    • 嗨,我做了一个非常精简的示例(基本上它与标准集群示例相同):gist.github.com/2909389 一段时间后,工作人员发送的消息在重载时不再到达主站负载(~5000-7000req/s)。工作人员功能齐全且反应灵敏......
    • 嗯,也许你应该把这个发布到 Node.js 组。可能有错误什么的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2021-12-13
    • 1970-01-01
    • 2021-11-28
    • 2015-01-02
    相关资源
    最近更新 更多