多进程模型和进程间通讯
我们知道 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);
}