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
   143   144   145   146   147   148   149   150   151   152   153