我在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);
}
我的问题是,有没有办法让一个全局对象就像在不同分叉实例之间的代码中显示的计数器对象一样,以便所有实例更新同一个对象?
答案 0 :(得分:8)
所有工作进程确实是应用程序变量的新副本。
每个工作人员都是使用child_process.fork
创建的全功能流程。在文档中,您可以获得以下声明:
工人之间没有共享状态。因为工人都是分开的 进程,它们可以被杀死或重新生成取决于你的 程序的需求,而不影响其他工作人员
所以答案是肯定的,你不能共享变量counter
,你的集群进程之间不会共享变量。
答案 1 :(得分: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
从子进程到master进行通信,并将更新部分保留在master。