最近在使用 egg.js ,这个框架提供多进程管理机制

我们知道 JavaScript 代码是运行在单线程上的,换句话说一个 Node.js 进程只能运行在一个 CPU 上。如何榨干服务器资源,利用上多核 CPU 的并发优势?而 Node.js 官方提供的解决方案是 Cluster 模块

cluster可以做到

  • 在服务器上同时启动多个进程。
  • 每个进程里都跑的是同一份源代码(好比把以前一个进程的工作分给多个进程去做)。
  • 更神奇的是,这些进程可以同时监听一个端口
  • 负责启动其他进程的叫做 Master 进程,他好比是个『包工头』,不做具体的工作,只负责启动其他进程。
  • 其他被启动的叫 Worker 进程,顾名思义就是干活的『工人』。它们接收请求,对外提供服务。
  • Worker 进程的数量一般根据服务器的 CPU 核数来定,这样就可以完美利用多核资源。

如何做到的

工作进程由child_process.fork()方法创建,因此它们可以使用IPC和父进程通信,从而使各进程交替处理连接服务。

实例

const numCPUs = require('os').cpus().length;
const cluster = require('cluster');
const http = require('http'); if (cluster.isMaster) {
console.log(`主进程 ${process.pid} 正在运行`); // 衍生工作进程。
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
} cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出`);
});
} else {
// 工作进程可以共享任何 TCP 连接。
// 在本例子中,共享的是一个 HTTP 服务器。
http.createServer((req, res) => {
res.writeHead(200);
res.end(`
worker process id is : ${process.pid};
worker id is ${cluster.worker.id}
`);
// 请求后kill worker
cluster.worker.kill();
}).listen(8000); console.log(`工作进程 ${process.pid} 已启动`);
}

请求 :http://localhost:8000/ 本地地址,可以看到 console的输出,直到worker全部关闭

  • 在一个主进程里,可以使用cluster.workers来获取Worker对象。
  • 在一个工作进程里,可以使用cluster.worker来获取Worker对象。
主进程 20875 正在运行
工作进程 20876 已启动
工作进程 20879 已启动
工作进程 20877 已启动
工作进程 20883 已启动
工作进程 20878 已启动
工作进程 20882 已启动
工作进程 20880 已启动
工作进程 20881 已启动
工作进程 20876 已退出
工作进程 20879 已退出
工作进程 20877 已退出
工作进程 20883 已退出
工作进程 20878 已退出
工作进程 20882 已退出
工作进程 20880 已退出
工作进程 20881 已退出

参考

最新文章

  1. react-native 学习之Image篇
  2. TP第2个项目总结
  3. xunsearch安装与卸载
  4. 基于visual Studio2013解决算法导论之053图的邻接表表示
  5. 面向矩阵的numpy入门笔记
  6. CSS 换行问题white-space属性 window对象和global对象
  7. java中Method.invoke方法参数解析
  8. 云笔记项目-Spring事务学习-传播NEVER
  9. LeetCode--No.012 Integer to Roman
  10. MVC和WebForm区别
  11. hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
  12. [译] OpenStack Ocata 版本中的 53 个新功能盘点
  13. 广二模拟赛 Problem A: 青春野狼不做理性小魔女的梦 解题报告
  14. python read file(f,csv)
  15. 【NLP】Stanford
  16. Git 使用篇一:初步使用GitHub,下载安装git,并上传项目
  17. SPOJ GSS
  18. codevs 5966 [SDOI2017]硬币游戏
  19. &lt;简明&gt;Markdown指南
  20. MVVM和MVC的区别,以及MVVM的缺点

热门文章

  1. JQ中find()与filter()的区别
  2. 图像处理之基础---傅立叶c实现
  3. html5+css3实现手机下拉和下拉刷新
  4. 驱动程序分层分离概念_总线驱动设备模型_P
  5. AFN多文件进度下载
  6. php自定义函数: amr转mp3格式
  7. Javascript对数组的操作--转载
  8. [note]CRT&amp;exCRT
  9. 在Ubuntu安装go编译环境
  10. eclispse + tomcat 启动是不加载项目的解决办法