nodejs开启多进程(简单实用,易看懂)
讲一下node是如何开启多进程来提高应用程序的性能和可扩展性。常见的方法有以下几种
第一种
使用child_process
模块创建子进程。这种方法通常用于执行一些耗时的计算任务,使用子进程可以将这些任务分配给不同的CPU核心进行并行处理
// process.js
const child_process = require("child_process");
for (var i = 0; i < 5; i++) {
var workProcess = child_process.exec(
"node son.js " + i, // 此处的i是传递到子进程中的值
function (err, stdout, stderr) {
if (err) {
console.log(err.stack);
console.log(err.code);
return;
}
console.log(stdout, "stdout");
console.log(stderr, "stderr");
}
);
// 退出事件
workProcess.on("exit", function (code) {
console.log(code, "子进程已退出");
});
}
子进程
// son
const sum = process.argv[2];
console.log("子进程正在执行" + sum);
上面是采用child_process
模块创建子进程,当然这只是其中的一种写法,还有其他写法就不一一列举了
第二种
使用cluster
模块创建主进程与工作进程。这种方法适用于构建具有高并发和负载均衡需求的Web服务器
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
相比第一种方法,我更推荐第二种,看看下面为什么哈,(下面是复制的,感觉不是特别难理解,所以就不做大白话解释了)
-
处理方式不同:cluster 模块是一种 Master-Worker 模式,主进程负责管理多个工作进程,并将请求分发给不同的工作进程处理;而 child_process 模块则是通过 fork() 方法来创建一个新进程并与其进行通信。
-
性能表现不同:使用 cluster 模块在多核 CPU 上性能更好,因为它可以充分利用多核 CPU 的优势,而 child_process 则需要额外的 IPC 通信,会造成性能损失。
-
内存利用率不同:当使用 cluster 模块时,多个工作进程可以共享一部分内存,从而减少了单个进程的内存占用,而 child_process 则每个子进程都需要一份完整的内存空间,因此在内存利用率方面稍逊于 cluster 模块。
-
方便程度不同:使用 cluster 模块通常比 child_process 更加方便,因为 cluster 可以自动管理多个工作进程并进行负载均衡,而 child_process 需要手动编写代码来控制各个子进程的运行状态和通信。
第三种
最省事的一种
使用pm2来管理
进程管理器来启动和监控多个进程。这种方法可以方便地管理多个进程,并提供各种监控和自动重启功能
pm2 start server.js -i max
简单把,但是以上方法都是灵活运用的,没有哪个绝对比哪个好,只有使用场景的不同