【发布时间】: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 取代,这就是我尝试使用的,但它不起作用。
我尝试过但不起作用的解决方案:
- 杀死我机器上的所有节点进程。
- 从这个主文件中删除所有内容,只留下准系统应用和集群配置。
我做错了什么?
【问题讨论】:
-
您使用的是什么节点版本?因为
isPrimary是在 v16 中添加的,所以当时弃用了isMaster。如果您使用的是 v14 或 v12,isPrimary不存在(因此它是虚假的)。要遵守所有版本(如果需要),您可以if (cluster.isPrimary || cluster.isMaster)。或更简洁:if (!cluster.isWorker). -
@StockOverflaw 你先生是 100% 正确的。谢谢!
标签: javascript node.js typescript express