Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node学习之Cluster模块 #28

Open
mhfe123 opened this issue Jun 27, 2019 · 0 comments
Open

Node学习之Cluster模块 #28

mhfe123 opened this issue Jun 27, 2019 · 0 comments

Comments

@mhfe123
Copy link
Contributor

mhfe123 commented Jun 27, 2019

众所周知,JS代码运行是单线程的,nodejs也是单线程的架构,一个nodejs实例就是一个nodejs进程,其中只存在一个JS线程,但是我们在构建系统的时候,单一线程有时候没有办法满足所有需要,而且对多核系统来讲,单一进程并不能充分利用系统资源,所以我们有时候需要启动多个nodejs实例来处理业务。

cluster模块可以创建共享服务器端口的子进程。

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

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('你好世界\n');
  }).listen(8000);

  console.log(`工作进程 ${process.pid} 已启动`);
}
// 运行结果
$ node server.js
主进程 3596 正在运行
工作进程 4324 已启动
工作进程 4520 已启动
工作进程 6056 已启动
工作进程 5644 已启动

工作原理

个人理解cluster其实是在child_process模块基础上进行的封装,里边的调用还是通过child_process进行的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant