【问题标题】:Why is NodeJs cluster module not working?为什么 NodeJs 集群模块不起作用?
【发布时间】:2021-10-28 21:35:46
【问题描述】:

所以基本上我正在构建一个express 服务器,并且我最近研究了扩展 NodeJS 应用程序的主题。我看到的第一件事是内置的cluster 模块,它可以利用机器处理器的所有线程。这是我的实现代码:

import cluster from "cluster";
import { cpus } from "os";

import dotenv from "dotenv";
dotenv.config();

import express, { Express } from "express";
import log from "./logger";
import database from "./database";
import router from "./router";

const app: Express = express();

// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

const port = <number>(<unknown>process.env.PORT);
const host = <string>process.env.HOST;

const numCPU = cpus().length;
if (cluster.isPrimary) {
   for (let i = 0; i < numCPU; i++) {
      cluster.fork();
   }

   cluster.on("listening", (worker) => {
      // Not printing anything
      console.log(worker.process.pid);
   });

   cluster.on("exit", (worker, code, signal) => {
      log.error(`Worker ${worker.process.pid} died. Starting a new worker...`);
      cluster.fork();
   });
} else {
   app.listen(port, host, () => {
      // Only prints this once.
      log.info(`Server ${process.pid} listening at http://${host}:${port}`);
      database();
      router(app);
   });
}

问题是 cluster.isPrimary从不运行当然意味着集群没有其他进程分叉。但是,当我使用cluster.isMaster 时,一切都按预期工作。但是由于 isMaster 已被弃用并被 isPrimary 取代,这就是我尝试使用的,但它不起作用。

我尝试过但不起作用的解决方案:

  1. 杀死我机器上的所有节点进程。
  2. 从这个主文件中删除所有内容,只留下准系统应用和集群配置。

我做错了什么?

【问题讨论】:

  • 您使用的是什么节点版本?因为isPrimary 是在 v16 中添加的,所以当时弃用了isMaster。如果您使用的是 v14 或 v12,isPrimary 不存在(因此它是虚假的)。要遵守所有版本(如果需要),您可以if (cluster.isPrimary || cluster.isMaster)。或更简洁:if (!cluster.isWorker).
  • @StockOverflaw 你先生是 100% 正确的。谢谢!

标签: javascript node.js typescript express


【解决方案1】:

它很可能是您正在运行的节点版本。 isPrimary 仅在 16+ 版本中可用,您很可能拥有 LTS 版本,即 v14

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多