2

我在基于 node.js 的 express 构建的 Rest api 应用程序中使用集群。

使用集群的 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);

}

我的问题是有什么方法可以让我拥有一个全局对象,就像代码中显示的不同分叉实例之间的计数器对象一样,以便所有实例都更新同一个对象?

4

2 回答 2

8

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

每个工作人员都是使用child_process.fork. 在文档中,您可以获得以下声明:

工人之间没有共享状态。因为工作人员都是独立的进程,所以可以根据程序的需要杀死或重新生成它们,而不会影响其他工作人员

所以答案是否定的,您不能共享变量counter,您的集群进程之间不会共享变量。

于 2013-07-15T11:54:06.823 回答
1

我通过将共享资源更新部分移动到 Master 来做到这一点

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从子进程与主进程通信并在主进程中保持更新部分。

于 2013-07-15T12:50:33.623 回答