nodejs之process

1.nodejs是单线程的,尽管如此,但是node运行在机器上还是能够运用上多核机器的性能,也就是说,node尽管被设计成了单线程的,但是还是可以做多进程的事情,实现这个的银弹就是Node内建的模块cluster。在多线程系统中,要想以并行的方式处理更多的任务的话,那么自然是使用多个线程来协同处理了。但是node被设计成一种单线程事件循环模式,所以在node中要想并行的处理多个任务的话,那么就需要使用其它方法了,在node里面,完成这个目的使用的是进程来处理。

2.使用cluster模块来创建进程,每当调用fork方法时,都会创建一个进程来运行和当前脚本一模一样的内容,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
const cluster = require('cluster');

if (cluster.isMaster) { // 判断是否是主进程
// 每当成功创建一个进程,便会emit一个online事件,而主进程能够监听这个事件
cluster.on('online', worker => {
console.log(`worker ${worker.process.pid} is online`);
});
for (let i = 0; i < 10; i++) { // 创建10个worker
cluster.fork();
}
} else {
// 这是worker,每个worker运行的工作可以放在这里
}

3.被fork出来的process也被叫做worker,每个worker能够和master通过各种events来进行交流。

4.再看一下下面这个例子:

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
'use strict';

const cluster = require('cluster');
const http = require('http');

const CPUS = require('os').cpus().length;
console.log('cpus', CPUS);

if (cluster.isMaster) {
console.log('master listening...');

cluster.on('listening', (worker, address) => {
console.log(worker.process.pid, address.address+''+address.port);
});

cluster.on('exit', worker => {
console.log(worker.process.pid + 'died');
});

for (let i = 0; i < CPUS; i++) {
cluster.fork();
}
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(0);
}

问:对于上面的打印cpus的数量这一行,会打印几遍呢?答案是打印CPUS+1遍,不仅每个创建出来的worker运行了这份脚本,而且主worker也运行了这份脚本。