关于Nodejs中`eventLoop`的一点探索

关于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示。

图1

紧接着,控制台多了一行输出,如 图2
关于Nodejs中`eventLoop`的一点探索_第1张图片
图2

这里我们可以看到,在启动两个worker的nodejs服务,会有两个eventLoop,所以在连续三次请求后,控制台会有两个console输出。在长时间等待后,出现了第三条console输出,说明其中一个worker被阻塞的事件环已经释放,开始执行下一个http回调函数。

由此可以得到这样的结论,对于cluster模式下的Nodejs服务。有多少个worker进程,就有多少个event loop。不同事件环阻塞,不会互相影响。

你可能感兴趣的:(关于Nodejs中`eventLoop`的一点探索)