node中cluster是怎样开启多进程的,并且一个端口可以被多个进程监听吗

83 阅读2分钟

在 Node.js 中,cluster 模块是用于创建多进程应用的模块,可以通过充分利用多核 CPU 来提高 Node.js 应用的性能和并发能力。

cluster 模块通过在主进程中创建多个子进程来实现多进程的方式。每个子进程都可以独立执行 Node.js 应用的代码,包括监听端口、处理请求等任务。这样可以充分利用多核 CPU 的处理能力,提高应用的性能和并发处理能力。

在使用 cluster 模块时,可以通过调用 cluster.fork() 方法来创建一个或多个子进程,每个子进程都会执行一份相同的代码,并且可以独立地监听端口。例如,以下是一个简单的使用 cluster 模块开启多进程的示例:

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

if (cluster.isMaster) {
  console.log(`Master process ID: ${process.pid}`);

  // 创建多个子进程
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  // 子进程运行的代码
  console.log(`Worker process ID: ${process.pid}`);

  // 创建 HTTP 服务器并监听端口
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello World');
  }).listen(3000);
}

上述示例中,主进程使用 cluster.isMaster 判断是否是主进程,如果是,则通过 cluster.fork() 创建多个子进程,每个子进程都会执行相同的代码。子进程则通过创建 HTTP 服务器来监听端口,处理请求。

需要注意的是,虽然每个子进程都可以监听相同的端口,但在实际运行中,只有其中一个子进程会真正地监听该端口,而其他子进程则会处于空闲状态。这是因为操作系统会使用操作系统级别的负载均衡机制,将请求分配给不同的子进程,从而实现多进程之间的负载均衡。因此,一个端口可以被多个进程监听,但实际上只有一个进程会处理请求。