Page 148 - Node.js开发指南
P. 148
6.3 Node.js 应用部署 141
这个语句的功能是判断当前模块是不是由其他模块调用的,如果不是,说明它是直接启 1
动的,此时启动调试服务器;如果是,则不自动启动服务器。经过这样的修改,以后直接调
用node app.js服务器会直接运行,但在其他模块中调用require('./app') 则不会自动
启动,需要再显式地调用 listen() 函数。
接下来就让我们通过cluster 调用app.js。创建cluster.js,内容如下所示: 2
var cluster = require('cluster');
var os = require('os');
// 获取CPU 的数量 3
var numCPUs = os.cpus().length;
var workers = {};
if (cluster.isMaster) {
4
// 主进程分支
cluster.on('death', function (worker) {
// 当一个工作进程结束时,重启工作进程
delete workers[worker.pid];
worker = cluster.fork();
workers[worker.pid] = worker; 5
});
// 初始开启与CPU 数量相同的工作进程
for (var i = 0; i < numCPUs; i++) {
var worker = cluster.fork();
workers[worker.pid] = worker;
} 6
} else {
// 工作进程分支,启动服务器
var app = require('./app');
app.listen(3000);
} 7
// 当主进程被终止时,关闭所有工作进程
process.on('SIGTERM', function () {
for (var pid in workers) {
process.kill(pid);
} 8
process.exit(0);
});
cluster.js 的功能是创建与CPU 核心个数相同的服务器进程,以确保充分利用多核CPU 的
资源。主进程生成若干个工作进程,并监听工作进程结束事件,当工作进程结束时,重新启 9
动一个工作进程。分支进程产生时会自顶向下重新执行当前程序,并通过分支判断进入工作
进程分支,在其中读取模块并启动服务器。通过cluster启动的工作进程可以直接实现端口
复用,因此所有工作进程只需监听同一端口。当主进程终止时,还要主动关闭所有工作进程。
10