关于eventLoop
的详细解释,请移步阮老师的<<什么是 Event Loop?>>,本文在这里不再详细阐述。
大家都了解,nodejs为我们提供了一个叫做cluster
的内置模块,可以让我们充分利用计算机的多核计算,提高效率。cluster模块允许设立一个主进程和若干个worker进程,由主进程监控和协调worker进程的运行。
那么问题来了,在启动多个worker进程后,在一个woker发生进程阻塞后,会不会影响其它worker的正常运行?
接下来,我们举个栗子
const cluster = require('cluster');
const http = require('http');
if (cluster.isMaster) {
for (let i = 0; i < 2; i++) {
cluster.fork();
}
cluster.on('exit',(worker,code,signal)=>{
console.log(`worker ${worker.process.pid} died`);
});
} else {
http
.createServer((req, res) => {
let i=0;
console.log(`time is ${Date.now()}`);
while(i<10000000000){
i++;
}
res.writeHead(200);
res.end('hello world\n');
})
.listen(8000);
}
上述代码帮我们启动了一个运行两个worker的nodejs集群服务。当我们用浏览器打开http://localhost:8000/
网址后,不出意外,页面进入了pending状态。这里相信大家都知道原因(while循环引发进程阻塞,res.end没有被调用)。
我们在这里做一个实验,在连续调用三次http://localhost:8000/
接口,发现在控制台有两行输出,如图1
示。
紧接着,控制台多了一行输出,如
图2
。这里我们可以看到,在启动两个worker的nodejs服务,会有两个eventLoop
,所以在连续三次请求后,控制台会有两个console输出。在长时间等待后,出现了第三条console输出,说明其中一个worker被阻塞的事件环已经释放,开始执行下一个http回调函数。
由此可以得到这样的结论,对于cluster
模式下的Nodejs服务。有多少个worker进程,就有多少个event loop
。不同事件环阻塞,不会互相影响。