nodejs如何解決高併發?
Node可以在不新增額外執行緒的情況下,依然可以對任務進行併發處理 —— Node.js是單執行緒的。它通過事件迴圈(event loop)來實現併發操作,對此,我們應該要充分利用這一點 —— 儘可能的避免阻塞操作,取而代之,多使用非阻塞操作。
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的node為什麼可以支援高併發呢?
因為I/O操作是由node的工作執行緒去執行的(nodejs底層的libuv是多執行緒的執行緒池用來並行io操作),且主執行緒是不需要等待結果返回的,只要發出指令馬上就可以去忙其他事情了。
佛山vi設計https://www.houdianzi.com/fsvi/ 豌豆資源搜尋大全https://55wd.com
額外知識點:
c. 雖然nodejs的I/O操作開啟了多執行緒,但是所有執行緒都是基於node服務程序開啟的,並不能充分利用cpu資源
pm2程序管理器可以解決這個問題
pm2 是一個帶有負載均衡功能的Node應用的程序管理器.
d. cpu核數與執行緒之間的關係
在過去單CPU時代,單任務在一個時間點只能執行單一程式。之後發展到多工階段,計算機能在同一時間點並行執行多工或多程序。
雖然並不是真正意義上的“同一時間點”,而是多個任務或程序共享一個CPU,並交由作業系統來完成多工間對CPU的執行切換,以使得每個任務都有機會獲得一定的時間片執行。而現在多核CPU的情況下,同一時間點可以執行多個任務,具體到這個任務在CPU哪個核上執行,這個就跟作業系統和CPU本身的設計相關了