2013-07-15 36 views
2

我在node.js中的express上构建的Rest api应用程序中使用了集群。有一个全局对象,其中包含node.js的集群模块

Rest API利用集群的完整代码是。

var cluster = require('cluster'); 
var numCPUs = require('os').cpus().length; 
var counter = {"color":{},"weight":{}}; 

if (cluster.isMaster) { 

     for (var i = 0; i < numCPUs; i++) { 
      cluster.fork(); 
     } 

     cluster.on('exit', function(worker, code, signal) {   
      var exitCode = worker.process.exitCode; 
      console.log('worker ' + worker.process.pid + ' died ('+exitCode+'). restarting...'); 
      cluster.fork();  
     }); 



} else {  

     var express = require("express"), 
     var msg; 
     var server = express();  
     server.use(express.bodyParser()); 
     server.post('/grouper', function (req, res) { 

      //some update on global counter   

     }); 

     server.listen(8080); 

} 

我的问题是有没有什么办法我能有一样的代码不同的分叉实例之间所示的计数器对象,使所有的情况下更新相同对象的全局对象?

+1

您可以共享的方式是在进程或其他一些消息协议(如ZeroMQ)之间的“消息”系统。 – moka

回答

8

所有工作进程确实是您的应用程序变量的独立副本。

每个工人都是使用child_process.fork创建的全功能工艺。在文件中你可以得到以下声明:

工人之间没有共享状态。由于工人都是独立的 进程,它们可以被杀死或重新催生取决于你 程序的需求,而不会影响其他工人

所以答案是否定的,你不能共享变量counter,您的群集过程不共享变量。

1

我通过共享资源更新部分移动到主像

if (cluster.isMaster) { 

     for (var i = 0; i < numCPUs; i++) { 

      var worker = cluster.fork(); 

      worker.on('message', function(msg) { 

       //update counter according to attributes in msg   
       console.log(counter); 

      }); 


     } 

     // some code 



} else {  

     var express = require("express"), 
     var msg; 
     var server = express();  
     server.use(express.bodyParser()); 
     server.post('/grouper', function (req, res) { 

      //some update on global counter 
      msg = req.body; 
      //communicate to master here 
      process.send(msg);  

     }); 

     server.listen(8080); 

} 

process.send从子进程通信掌握并保持更新用部分在主这样做。

相关问题