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`);
}

相比第一种方法,我更推荐第二种,看看下面为什么哈,(下面是复制的,感觉不是特别难理解,所以就不做大白话解释了)

  1. 处理方式不同:cluster 模块是一种 Master-Worker 模式,主进程负责管理多个工作进程,并将请求分发给不同的工作进程处理;而 child_process 模块则是通过 fork() 方法来创建一个新进程并与其进行通信。

  2. 性能表现不同:使用 cluster 模块在多核 CPU 上性能更好,因为它可以充分利用多核 CPU 的优势,而 child_process 则需要额外的 IPC 通信,会造成性能损失。

  3. 内存利用率不同:当使用 cluster 模块时,多个工作进程可以共享一部分内存,从而减少了单个进程的内存占用,而 child_process 则每个子进程都需要一份完整的内存空间,因此在内存利用率方面稍逊于 cluster 模块。

  4. 方便程度不同:使用 cluster 模块通常比 child_process 更加方便,因为 cluster 可以自动管理多个工作进程并进行负载均衡,而 child_process 需要手动编写代码来控制各个子进程的运行状态和通信。

第三种

最省事的一种

使用pm2来管理进程管理器来启动和监控多个进程。这种方法可以方便地管理多个进程,并提供各种监控和自动重启功能

pm2 start server.js -i max

简单把,但是以上方法都是灵活运用的,没有哪个绝对比哪个好,只有使用场景的不同