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' });
}