詳解node單執行緒實現高併發理與node非同步I/O

NO IMAGE

一、node單執行緒實現高併發原理

眾所周知nodejs是單執行緒且支援高併發的指令碼語言。可為什麼單執行緒的nodejs可以支援高併發呢?很多人都不明白其原理,下面我來談談我的理解:

1. node的優點:I/O密集型處理是node的強項,因為node的I/O請求都是非同步的(如:sql查詢請求、檔案流操作操作請求、http請求…)

a. 什麼是非同步?

非同步:發出操作指令,然後就可以去做別的事情了,所有操作完成後再執行回撥

非同步的實現原理: 


// 第一步:定義變數
let a = 1;
// 第二步:發出指令,然後把回撥函式加入非同步佇列(回撥函式並沒有執行)
setTimeout(() => {
console.log(a);
}, 0)
// 第三步:賦值,回撥函式沒有執行
a = 2;
// 第四步:發出指令,然後把回撥函式加入非同步佇列(回撥函式並沒有執行)
setTimeout(() => {
console.log(a);
}, 0)
// 第五步:賦值,回撥函式沒有執行
a = 3;
// 當所有程式碼執行完畢,cpu空閒下來了,就會開始執行非同步佇列裡面的回撥函式
// 所以最後控制檯輸出:3 3

b. 什麼是非同步I/O?

非同步I/O顧名思義就是非同步的發出I/O請求

c. 雖然nodejs可以非同步的發出I/O請求,但nodejs不支援多執行緒,為啥就可以支援高併發呢?

因為nodejs的I/O操作,底層是開啟了多執行緒的

當同時有多個IO請求時,主執行緒會建立多個eio執行緒,以提高IO請求的處理速度    

額外知識點:

d. 雖然nodejs的I/O操作開啟了多執行緒,但是所有執行緒都是基於主執行緒開啟的只能跑在一個程序當中還是不能充分利用cpu資源

pm2程序管理器可以解決這個問題

pm2 是一個帶有負載均衡功能的Node應用的程序管理器.

e. cpu核數與執行緒之間的關係

在過去單CPU時代,單任務在一個時間點只能執行單一程式。之後發展到多工階段,計算機能在同一時間點並行執行多工或多程序。雖然並不是真正意義上的“同一時間點”,而是多個任務或程序共享一個CPU,並交由作業系統來完成多工間對CPU的執行切換,以使得每個任務都有機會獲得一定的時間片執行。而現在多核CPU的情況下,同一時間點可以執行多個任務,具體到這個任務在CPU哪個核上執行,這個就跟作業系統和CPU本身的設計相關了

2. node的缺點:不擅長cpu密集型的操作

a. 什麼是cpu密集型操作(複雜的運算、圖片的操作)


// 這就是一個cpu密集型的操作
for (let i = 0; i < 1000000; i  ) {
console.log(i);
}

b. nodejs為什麼不擅長cpu密集型操作

因為nodejs是單執行緒的

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家。

您可能感興趣的文章:

深入淺析Node.js單執行緒模型詳解nodejs非同步I/O和事件迴圈解析NodeJS非同步I/O的實現nodejs教程之非同步I/ONode.js非同步I/O學習筆記