繁体   English   中英

node.js中的集群模块

[英]Cluster module in 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 将请求路由到 worker,如何确保 master 始终在运行并侦听端口?

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

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

或者,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM