如何在node.js中创建主节点

时间:2014-12-02 08:07:27

标签: javascript node.js cluster-computing

我对node.js中的cluster / child_process模块​​很新。任何人都可以告诉我们如何创建主节点或如何将节点作为主节点?

大多数教程都提到如何验证节点是Master还是Worker(代码下面),而不是如何创建master。

编辑:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
    //cluster.fork(); ----------(2)
  });
} else {
  // Workers can share any TCP connection
  // In this case its a HTTP server
    //cluster.fork();-----------(1)
  http.createServer(function(req, res) {
    res.writeHead(200);
    console.log("hello worldd");
    res.end("hello worldd\n");
  }).listen(8000);
}

编辑:如何创建连续运行的正确子进程。如果我在上面的代码中使用cluster.fork(如1)创建新进程,则会立即创建和销毁工作进程。如果我在上面的代码中创建像(2)这样的工作者,它将进入无限循环的过程死亡和创造。如果上述示例不明确,请提供任何代码或链接,以演示创建子进程和同时处理不同进程的多个请求的正确工作示例。 非常感谢。

2 个答案:

答案 0 :(得分:1)

您实际上创建主人。当您致电cluster.fork时,它会创建一个子流程。主人仍然存在。 child和master都在相同的代码库上运行,并根据cluster.isMaster进行区分。

编辑:

如果要在端口8000上创建服务/网络服务器。您应该按照(2)中的说明进行操作。除了,对于你的情况,它将进入一个无限循环,因为你在'退出'事件上这样做而没有真正检查它'退出'的原因​​。您可以通过选中worker.suicide

来避免

例如:

if(cluster.isMaster) {
  for(var i = 0; i< numCpus; i++)
     cluster.fork();

  cluster.on('exit', function(worker) {
    if(worker.suicide) //do nothing
    else cluster.fork();
  });
} else {
  // create server && listen on 8000
  // no need to involve cluster here.
  http.createServer(function(req, res) {}).listen(8000);
}

已编辑:示例要点:https://gist.github.com/limianwang/55e8a0b6ca816e024358

阅读:

http://nodejs.org/api/cluster.html#cluster_worker_suicide

答案 1 :(得分:1)

cluster.fork()创建一个不退出的子进程。调用res.end()不会退出子节点,它会等待并侦听更多连接。

上面的情况(2)只会在孩子调用process.exit()或被杀死时发生,在这种情况下,master会想要替换丢失的工作进程,但这不是一个紧密的循环。