nodejs多进程cluster

  目录

使用cluster开启nodejs多进程

nodejs多进程cluster

nodejs是单线程语言,如果一台电脑cpu是8核的,nodejs只能使用其中的一个,另外7个都没有使用到,cpu的资源都浪费了。
cluster这个包可以开启多个进程,可以完全利用电脑的cpu资源。
pm2这个工具内部也是用cluster开启的nodejs多进程
笔者写了一个小例子:

cluster.js

这个文件开启多进程,并且可以守护进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var cluster = require('cluster');
var os = require('os'); // 获取CPU 的数量
var numCPUs = os.cpus().length;

// numCPUs = 2
var process = require('process')

var workers = {};
if (cluster.isMaster) {
// 主进程分支
cluster.on('exit', (worker, code, signal) => {
console.log('工作进程 %d 关闭 (%s). 重启中...',
worker.process.pid, signal || code);
delete workers[worker.process.pid]
worker = cluster.fork()
workers[worker.process.pid] = worker
console.log('新的工作进程', worker.process.pid)
console.log(Object.keys(workers))
});

console.log('numCPUs:', numCPUs)
for (var i = 0; i < numCPUs; i++) {
var worker = cluster.fork();
console.log('init ... pid', worker.process.pid)
workers[worker.process.pid] = worker;
}
} else {
var app = require('./app');
app.listen(3000);
}
// 当主进程被终止时,关闭所有工作进程
process.on('SIGTERM', function () {
for (var pid in workers) {
process.kill(pid);
}
process.exit(0);
});

app.js

这里就是一个普通http服务程序,有10%的几率抛出错误,检测cluster的守护进程功能

1
2
3
4
5
6
7
8
9
10
11
12
const http = require('http')
const server = http.createServer((request, response) => {
Math.random() > 0.9 ? fn() : ''
response.end('Hello jinux')
})

if (!module.parent) {
server.listen(3000);
console.log('app started at port 3000...');
} else {
module.exports = server
}

test.js

这里用来测试端口

1
2
3
4
5
6
var request = require('request');
setInterval(() => {
request('http://localhost:3000', function (error, response, body) {
console.log('body:', body); // Print the HTML for the Google homepage.
})
}, 2000);

最后附上demo的代码source