为了充分利用多核cpu,采用多进程。而由于需求中,需要用到子进程与主进程之间消息交互处理。故不能使用pm2命令实现多进程,而是采用nodejs中cluster模块实现。 Demo如下
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('listening', function (worker, address) {
console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port);
});
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].on('message', function(msg){
console.log('[master] ' + 'message ' + msg);
cluster.workers[id].send('[master] ' + 'hi worker' +process.pid);
});
});
} else if (cluster.isWorker) {
process.send('[worker] worker'+process.pid+' received!');
process.on('message', function(msg) {
console.log('[worker] '+msg);
});
http.createServer(function (req, res) {
res.writeHead(200, {"content-type": "text/html"});
res.end('worker'+cluster.worker.id+',PID:'+process.pid);
}).listen(3000);
}
使用node运行时候,node demo.js 。正常
使用pm2运行时候,pm2 start demo.js 。通过pm2 monit 监控,发现日志一直在打印记录,意味着进程会一直发送消息,而不是停止 .forEach(function (id) {
cluster.workers[id].on('message', function (msg) {
console.log('[master] ' + 'message ' + JSON.stringify(msg));
cluster.workers[id].send('[master] ' + 'hi worker' + process.pid);
});
});
很显然,每收到一条 pm2 发送的 pmx 监控数据就会又触发向子进程发送消息,所以你用 pm2 启动会看到日志一直输出。
要解决这个问题也很简单,启动参数带上 --no-pmx 即可:
pm2 start socket.js --no-pmx
@hyj1991 原来是这个原因。了解啦。谢谢你。