Nodejs 利用cluster来让程序充分利用多核CPU
Nodejs 利用cluster来让程序充分利用多核CPU
在nodejs官方网站上面都可以看到这种代码
if(cluster.isMaster){
for(var i = 0 ; i < numCPUS ; i ++){
cluster.fork();
}
cluster.on('exit',function(worker,code,signal){
console.log('worker ',worker.process.pid," is died");
process.exit();
});
}else{
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
}
请看中间的cluster.on(‘exit’)…这里面的部分
我相信很多人都希望当cluster结束后直接再重新开启,会将里面的process.exit()改为cluster.fork()
这一点比较关键,因为这么干了之后就会出现很多cluster.fork()绑定不上的情况,一直循环报错
所以还是让process退出,然后用supervisor脚本来重启这个进程比较合适
2 回复
为了充分利用多核CPU,可以使用Node.js的cluster
模块。该模块允许你创建子进程(worker),这些子进程可以利用不同的CPU核心来执行任务。下面是一个完整的示例代码,展示了如何使用cluster
模块来实现这一点。
示例代码
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
console.log(`Starting a new worker`);
cluster.fork();
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
解释
-
Master 进程:
isMaster
检查当前进程是否是主进程。- 主进程根据系统中的CPU核心数量创建相应数量的工作进程(worker)。
- 监听工作进程的退出事件,并在工作进程退出时自动启动新的工作进程以保持服务的稳定性。
-
Worker 进程:
- 每个工作进程监听一个HTTP端口(例如8000)并响应请求。
- 当接收到请求时,它会返回“Hello World”。
处理工作进程退出
如果你希望在工作进程退出后立即启动一个新的工作进程,可以在cluster.on('exit')
事件处理函数中调用cluster.fork()
,但这样做可能会导致进程频繁地启动和退出,从而导致性能问题或错误。
为了避免这种情况,通常建议在工作进程退出后让主进程退出,然后使用外部工具(如pm2
或forever
)来监控并自动重启主进程。这样可以更好地管理资源,并避免频繁的进程重启带来的不稳定因素。
npm install -g pm2
pm2 start your-script.js --watch
这将确保你的应用能够在所有核心上高效运行,并且在工作进程退出后能够自动恢复。