nodejs如何使用clusster配置多cpu

2023-12-26 08:32:51

Nodejs的主进程是单线程的,但它有多线程处理?案(更准备来说是多进程?案),即主进程开启不同的?进程,主进程接收所有请求,然后将分发给其它不同的nodejs?进程处理。
它?般有两种实现:
1. 主进程监听?个端?,?进程不监听端?,通过主进程分发请求到?进程;
2. 主进程和?进程分别监听不同端?,通过主进程分发请求到?进程。
cluster模式的?的就是第?种实现,它使??个主线程和多个?线程,形成?个集群,通过主线程来向?线程分发请求。

在Node.js中,您可以使用Cluster模块来配置多CPU。Cluster模块允许您创建多个子进程,每个子进程都运行在独立的CPU上,从而提高应用程序的性能。

以下是一个使用Cluster模块配置多CPU的示例:

const cluster = require('cluster'); ?
const http = require('http'); ?
const numCPUs = require('os').cpus().length; ?
??
if (cluster.isMaster) { ?
? console.log(`主进程 ${process.pid} 正在运行`); ?
??
? // 循环创建工作进程 ?
? for (let i = 0; i < numCPUs; i++) { ?
? ? cluster.fork(); ?
? } ?
??
? cluster.on('exit', (worker, code, signal) => { ?
? ? console.log(`工作进程 ${worker.process.pid} 已退出`); ?
? }); ?
} else { ?
? // 工作进程可以共享任何TCP连接。在此示例中,我们将共享一个HTTP服务器。 ?
? http.createServer((req, res) => { ?
? ? res.writeHead(200); ?
? ? res.end('你好世界\n'); ?
? }).listen(8000); ?
??
? console.log(`工作进程 ${process.pid} 已启动`); ?
}
?

为什么我们在主进程代码块以及?进程代码块之外来声明的变量不应该是全局变量么?答案是否定的。因为每个进程在内存都有各?的区域,因此data++操作是在各?的区域内进?的,也就是说变量data没被共享。那么怎么来在各进程之间共享数据呢?来看下?的代码

var cluster = require('cluster');

var http = require('http');

if (cluster.isMaster) {

var numCPUs = require('os').cpus().length;

var data = 0;

// 启动多个进程.

for (var i = 0; i < numCPUs; i++) {

//增加?个进程

var worker_process = cluster.fork();

//侦听?进程的message事件

worker_process.on('message', function(msg) {

if (msg.cmd && msg.cmd == 'notifyRequest') {

data++;

console.log('DATA VALUE : %d ', data);

}

});

}

} else {

process.send({ cmd: 'notifyRequest' });

}

文章来源:https://blog.csdn.net/weixin_42095178/article/details/135210363
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。