node單線程支撐高並發原理(node異步I/O)


一、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操作),且主線程是不需要等待結果返回的,只要發出指令馬上就可以去忙其他事情了。   

    額外知識點:

    c. 雖然nodejs的I/O操作開啟了多線程,但是所有線程都是基於node服務進程開啟的,並不能充分利用cpu資源

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

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

    d. cpu核數與線程之間的關系

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

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

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

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

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

      因為nodejs是單線程的,進行密集型的運算會導致主線程掛起

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM