Node.js程序是单进程运行的,使用Express框架开发的Web应用同样也是。当使用多核系统时,这会导致对多核资源的浪费。这时,我们可以使用Node.js的cluster
模块创建一个多核集群,让Express应用多进程运行,充分利用多核资源。
1. 修改启动文件
创建Express
应用后,其默认是单进程运行。我们将对其启动文件bin/www
修改如下:
#!/usr/bin/env node var debug = require('debug')('my-application'); var app = require('../app'); app.set('port', process.env.PORT || 3000); var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork启一个Worker 进程 for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('listening', (worker, address) => { console.log('worker ' + worker.process.pid +', listen: '+address.address+":"+address.port); }); cluster.on('exit', (worker, code, signal) => { console.log('worker ' + worker.process.pid + ' died'); //重启一个worker进程 cluster.fork(); }); } else { // Worker 进程之间可以共享任何形式的TCP连接 // 也可以启动一个express的web服务 app.listen(app.get('port')); }
在Node.js的cluster
模块中,分为主进程Master
和工作进程Worker
两种对象。Master
一般用于进程的管理,如:在子进行异常退出后重启一个子进程,而子进行用于具体的事务处理。
在上面示例中,我们主进程用于启动及重启子进程,而子进程用于运行HTTP
服务器。
2. 程序的多进程运行
修改完成后,我们通过node bin/www
命令启动程序,会看到类似如下输出:
worker 17963, listen: null:3000 worker 17966, listen: null:3000 worker 17964, listen: null:3000 worker 17965, listen: null:3000
这样,就实现了Express应用的多进程运行。当用户发起HTTP请求时,请求会被随机会配到一个工作进程中进行处理。
更多关于cluster
模块的介绍请参考:cluster
模块让Node.js充分利用多核资源
转自:http://itbilu.com/nodejs/npm/NJ3SkiX3l.html
你打算打赏多少钱呢?
(微信扫一扫)