[英]Why is this code not working in NodeJS after exporting it to a separate module?
[英]Why is NodeJs cluster module not working?
所以基本上我正在构建一个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 取代,这就是我想要使用的,但它不起作用。
我尝试过但不起作用的解决方案:
我究竟做错了什么?
它最有可能是您正在运行的节点版本。 isPrimary 仅在 16+ 版本中可用,您很可能拥有 LTS 版本,即 v14
前段时间,在 NODE 版本 v0.8.1 中添加的cluster.isMaster
从 16.0.0 版本开始被弃用。 仅当您的 NODE 版本至少为 16.0.0 时,只需将已弃用的cluster.isMaster
替换为cluster.isPrimary
(就像您所做的那样)。
如果您不知道您的版本,请输入node -v
并在终端中按回车键。 如果您需要更新您的 NODE 版本,您有不同的选项,具体取决于您的操作系统。 如果您在 PC 上运行 Windows 或 mac,您可以 - 例如 - 访问 NODE 官方网站并下载并安装最新版本: https ://nodejs.org/en/download/current/
如果进程是主进程,则后台cluster.isPrimary
返回 true。 相反,如果进程不是主进程,您可以使用cluster.isWorker
返回 true。 所以这是对cluster.isPrimary
的否定。
许多博客文章、文章和教程仍在应用已弃用的cluster.isMaster
。 这会导致第一次处理 NODE 集群的节点用户感到恼火。
官方信息由 NODE 提供: https ://nodejs.org/api/cluster.html#clusterismaster
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.