node.js - NodeJS process.send 停止工作

标签 node.js cluster-computing

我正在尝试使用 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),它会阻止事件循环。你永远不应该(再次)使用这样的东西。相反,您应该使用 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);
}

关于node.js - NodeJS process.send 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669464/

相关文章:

node.js - 使用 AWS Amplify 创建 process.env 变量?

javascript - 在调用 res.end 之前,nodejs 中的 res.write 是否会阻止服务器响应其他请求?

javascript - MongoDB 中待处理的 promise

java - 如何以编程方式查找/列出 J2EE 应用程序集群中的所有节点?

apache - 独立 Hadoop 集群的系统配置

ssh - 使用 qdel 一次删除我的所有作业,而不是一次删除一个作业

linux - 自动化 : finding non-used servers from a list of servers

javascript - 如何使用nodejs读取文本文件的特定部分

node.js - 无法从 session Express 获取用户 ID

tomcat - Docker集群多个代理前面多个tomcats