關(guān)于Nodejs中`eventLoop`的一點探索

關(guān)于eventLoop的詳細(xì)解釋,請移步阮老師的<<什么是 Event Loop?>>,本文在這里不再詳細(xì)闡述。

大家都了解,nodejs為我們提供了一個叫做cluster的內(nèi)置模塊,可以讓我們充分利用計算機(jī)的多核計算,提高效率。cluster模塊允許設(shè)立一個主進(jìn)程和若干個worker進(jìn)程,由主進(jìn)程監(jiān)控和協(xié)調(diào)worker進(jìn)程的運行。

那么問題來了,在啟動多個worker進(jìn)程后,在一個woker發(fā)生進(jìn)程阻塞后,會不會影響其它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集群服務(wù)。當(dāng)我們用瀏覽器打開http://localhost:8000/網(wǎng)址后,不出意外,頁面進(jìn)入了pending狀態(tài)。這里相信大家都知道原因(while循環(huán)引發(fā)進(jìn)程阻塞,res.end沒有被調(diào)用)。

我們在這里做一個實驗,在連續(xù)調(diào)用三次http://localhost:8000/接口,發(fā)現(xiàn)在控制臺有兩行輸出,如圖1示。

圖1

緊接著,控制臺多了一行輸出,如圖2。
圖2

這里我們可以看到,在啟動兩個worker的nodejs服務(wù),會有兩個eventLoop,所以在連續(xù)三次請求后,控制臺會有兩個console輸出。在長時間等待后,出現(xiàn)了第三條console輸出,說明其中一個worker被阻塞的事件環(huán)已經(jīng)釋放,開始執(zhí)行下一個http回調(diào)函數(shù)。

由此可以得到這樣的結(jié)論,對于cluster模式下的Nodejs服務(wù)。有多少個worker進(jìn)程,就有多少個event loop。不同事件環(huán)阻塞,不會互相影響。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容