博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs cluster 学习记录
阅读量:7085 次
发布时间:2019-06-28

本文共 1582 字,大约阅读时间需要 5 分钟。

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

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

cluster可以做到

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

如何做到的

工作进程由方法创建,因此它们可以使用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} 已启动`);}

请求 : 本地地址,可以看到 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 已退出

参考

  • 多进程模型和进程间通讯:
  • cluster_cluster_workers:
  • 通过源码解析 Node.js 中 cluster 模块的主要功能实现 :

转载于:https://www.cnblogs.com/xiaoniuzai/p/7191792.html

你可能感兴趣的文章
SCVNGR游戏开发“三十六计”(全) - [资料收集]
查看>>
java 适配器模式
查看>>
React Native填坑之旅 -- 使用iOS原生视图(高德地图)
查看>>
【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
查看>>
Linux 小知识翻译 - 「编译器和解释器」
查看>>
ADO.NET编程(4)根据条件查询DataTable的值
查看>>
android 42 获取图片
查看>>
LeetCode:Permutation Sequence
查看>>
golang copy函数
查看>>
动态加载用户控件----以用户控件的方式达到代码分离的目的[转]
查看>>
【记录】从客户端()中检测到有潜在危险的 Request.Path 值。
查看>>
神秘的subsys_initcall【转】
查看>>
【转】Nginx服务器的反向代理proxy_pass配置方法讲解
查看>>
【OpenCV学习】Laplace变换(视频边界检测)
查看>>
关于Visual Studio无法连接到Visual Studio 的Localhost Web服务器问题
查看>>
页面限制8060 bytes
查看>>
【Android Demo】自定义Activity的标题栏(Titlebar)
查看>>
Android Studio项目整合PullToRefresh的问题记录
查看>>
Windows Azure Cloud Service (24) 使用Startup注册COM组件(上)
查看>>
多种最值算法,适时选择
查看>>