關(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示。

緊接著,控制臺多了一行輸出,如
圖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)阻塞,不會互相影響。