本文主要和大家介紹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?
非同步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單執行緒實作高並發原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!