溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解node單線程實現(xiàn)高并發(fā)原理與node異步I/O

發(fā)布時間:2020-09-26 17:34:07 來源:腳本之家 閱讀:137 作者:dudeyouth 欄目:web開發(fā)

一、node單線程實現(xiàn)高并發(fā)原理

眾所周知nodejs是單線程且支持高并發(fā)的腳本語言??蔀槭裁磫尉€程的nodejs可以支持高并發(fā)呢?很多人都不明白其原理,下面我來談談我的理解:

1. node的優(yōu)點:I/O密集型處理是node的強項,因為node的I/O請求都是異步的(如:sql查詢請求、文件流操作操作請求、http請求...)

a. 什么是異步?

異步:發(fā)出操作指令,然后就可以去做別的事情了,所有操作完成后再執(zhí)行回調(diào)

異步的實現(xiàn)原理: 

// 第一步:定義變量
let a = 1;

// 第二步:發(fā)出指令,然后把回調(diào)函數(shù)加入異步隊列(回調(diào)函數(shù)并沒有執(zhí)行)
setTimeout(() => {
 console.log(a);
}, 0)
// 第三步:賦值,回調(diào)函數(shù)沒有執(zhí)行
a = 2;
// 第四步:發(fā)出指令,然后把回調(diào)函數(shù)加入異步隊列(回調(diào)函數(shù)并沒有執(zhí)行)
setTimeout(() => {
 console.log(a);
}, 0)
// 第五步:賦值,回調(diào)函數(shù)沒有執(zhí)行
a = 3;
// 當所有代碼執(zhí)行完畢,cpu空閑下來了,就會開始執(zhí)行異步隊列里面的回調(diào)函數(shù)
// 所以最后控制臺輸出:3 3

b. 什么是異步I/O?

異步I/O顧名思義就是異步的發(fā)出I/O請求

c. 雖然nodejs可以異步的發(fā)出I/O請求,但nodejs不支持多線程,為啥就可以支持高并發(fā)呢?

因為nodejs的I/O操作,底層是開啟了多線程的

當同時有多個IO請求時,主線程會創(chuàng)建多個eio線程,以提高IO請求的處理速度    

額外知識點:

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

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

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

e. cpu核數(shù)與線程之間的關系

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

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

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

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

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

因為nodejs是單線程的

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI