node 多进程模型和进程间通讯

2024-04-19

多进程模型和进程间通讯

我们知道 JavaScript 代码是运行在单线程上的, 换句话说, 一个 Node.js 进程只能运行在一个 CPU 上. 那么如果用 Node.js 来做 Web Server, 就无法享受到多核运算的好处. 作为企业级的解决方案, 我们要解决的一个问题就是:

如何榨干服务器资源, 利用上多核 CPU 的并发优势?

Node.js 官方提供的解决方案是 Cluster 模块. 其中包含一段简介:

单个 Node.js 实例在单线程环境下运行. 为了更好地利用多核环境, 用户有时希望启动一批 Node.js 进程用于加载.

集群化模块使得你很方便地创建子进程, 以便于在服务端口之间共享.

Cluster 是什么?

简单地说, Cluster 是:

在服务器上同时启动多个进程. 每个进程里都运行着同一份源代码(好比把以前一个进程的工作分给多个进程去做). 这些进程可以同时监听一个端口. 其中:

负责启动其他进程的叫做 Master 进程, 不做具体的工作, 只负责启动其他进程. 其他被启动的进程叫 Worker 进程, 它们接收请求, 对外提供服务. 这一部分内容让我想起了大学的选修课, <<开源软件分析与实践>>, 其中的内容就有用 c 语言做 linux 的系统调用 fork.

Worker 进程的数量一般根据服务器的 CPU 核数来定, 这样可以完美利用多核资源.

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

if (cluster.isMaster) {
  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection.
  // In this case it is an HTTP server.
  http
    .createServer((req, res) => {
      res.writeHead(200);
      res.end('hello world\n');
    })
    .listen(8000);
}
copyright ©2019-2024 shenzhen
粤ICP备20041170号-1