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

1、node單線程實現高併發原理node

  衆所周知nodejs是單線程且支持高併發的腳本語言。可爲何單線程的nodejs能夠支持高併發呢?不少人都不明白其原理,下面我來談談個人理解:sql

  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操做),且主線程是不須要等待結果返回的,只要發出指令立刻就能夠去忙其餘事情了。   高併發

    額外知識點:spa

    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是單線程的,進行密集型的運算會致使主線程掛起

相關文章
相關標籤/搜索