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) { cluster.on('online', worker => { console.log(`worker ${worker.process.pid} is online`); }); for (let i = 0; i < 10; i++) { cluster.fork(); } } else { }
|
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也运行了这份脚本。