问题描述
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 可以杀死子进程。当您的子进程不会被杀死时,这是您需要做的事情。可能有很多场景无法涵盖所有这些场景,但我尝试给出一个总体概述以避免出现此类情况。