1.新建一个http服务,http.js(已有一个index.htm页面)
const fs = require('fs');
const http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'content-type':'text/html'}); //读文件
res.end(fs.readFileSync(__dirname + '/index.htm','utf-8')); //写出去
}).listen(3000,() => {
console.log('listened 3000');
})
2.使用cluster模块,使主进程fork一堆子进程,每个子进程跑一个上述的http实例
index.js文件
const cluster = require('cluster'); //引入cluster模块
if(cluster.isMaster){ //如果当前是在主进程
for(let i = 0;i<os.cpus().length/2;i++){ //获取当前电脑有多少个核的cpu,获取CPU的总的核数
cluster.fork(); //启动子进程
}
}else{ //当前不在主进程
require('./http');
}
可以明显的性能提升
node.js中每个进程都会有4个子线程去完成事件循环
每次fork进程,都是把node.js复制一遍,造成成倍的内存消耗;因此,一般来说,并不会把子进程的数目等于cpu的总的核数,而是会有一些余量os.cpus().length/2
3.上述代码,在每一个子进程的代码里面,都去监听了3000端口,而一般来说,计算机里的端口只能被监听一次,如果有多个进程同时监听一个端口,第一个后面的进程全都会报错,报3000端口已经被占用了。而上述代码并未报错,是因为cluster模块复写了clientserver,监听了是文件描述,而不是端口