node.js 中的集群模块

问题描述

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

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

  // 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);

  console.log(`Worker ${process.pid} started`);
}

我们生成的工作线程数量与系统中的内核数量一样多。 所以对于 4 个内核,我们在主进程中产生 4 个工人。那么主进程究竟在哪里运行,即在哪个核心上运行?既然 master 将请求路由到 worker,那么如何确保 master 始终运行并监听端口?

解决方法

这是 cpu scheduling 的一部分,操作系统将管理哪个内核应该运行哪个进程。

您可以创建比可用的 cpus 多的子进程(不建议这样做),因此 os 将处理哪个 cpu 核心将运行哪个进程,主进程可以与某些子进程共享 cpu。

,

我们生成的工作线程数量与系统中的内核数量一样多。所以 对于 4 个内核,我们在主进程中生成 4 个工人。那么究竟在哪里 主进程运行,即在哪个核心上运行?

内核的进程分配是由操作系统根据某些参数完成的。但是,如果您没有运行集群模块 Node.js 运行单线程,并且如果您使用集群运行 Node.js 应用程序,主线程将成为主线程,您可以根据您的操作系统和硬件配置生成子进程,而不是深入

并且由于主路由请求给工作人员,如何确保 master 总是在一个端口上运行和监听?

有时您的主进程会被杀死,但子进程不会收到信号。所以,他们确实跑了。但是,您可以使用简单的代码来处理这种情况:

const k = cp.spawn();
childPids.push(k.pid)

或者,

const k = cp.fork();
childPids.push(k.pid)

使用 pid 可以杀死子进程。当您的子进程不会被杀死时,这是您需要做的事情。可能有很多场景无法涵盖所有​​这些场景,但我尝试给出一个总体概述以避免出现此类情况。