node.js非同步式IO與事件式程式設計
阿新 • • 發佈:2019-01-25
Node.js最大的特性就是非同步式I/O與事件緊密結合的程式設計模式。這種模式與傳統的同步式IO線性的程式設計思路有很大的不同,因為控制流很大程度上要靠事件和回撥函式來組織,一個邏輯要拆分為若干個單元格。
內容:阻塞和執行緒
1.同步式I/O或阻塞式I/O
執行緒在執行中如果遇到磁碟讀寫或網路通訊,通常要耗費較長時間。這時作業系統會剝奪這個執行緒的CPU控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式成為阻塞,當I/O操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其對CPU的控制權、令其繼續執行。
2.非同步式I/O或非阻塞式I/O
針對所有I/O操作不採用阻塞策略,當執行緒遇到I/O操作時,不會以阻塞的方式等待I/O操作的完成或資料的返回,而只是講IO請求傳送給作業系統,繼續執行下一條語句,當作業系統完成IO操作時,以事件的形式通知執行IO操作的執行緒,執行緒會在特定時候處理這個事件,為了 處理非同步IO,執行緒必須有事件迴圈,不斷的檢查有沒有未處理的事件,依次予以處理。
3.非阻塞與阻塞模式區別
非阻塞模式下,一個執行緒永遠在執行計算操作,這個執行緒所使用的CPU核心利用率永遠是100%,IO以事件的方式通知。
阻塞模式下,多執行緒往往能提高系統吞吐量,因為一個執行緒阻塞還有其他執行緒在工作,多執行緒可以讓CPU資源不被阻塞中的執行緒浪費。
排程:當前一個工作,在5分鐘之後執行
4.同步式IO與非同步式IO區別
同步式IO(阻塞式) 非同步式IO(非阻塞)
利用多執行緒提供吞吐量 單執行緒即可實現高吞吐量
通過事件片分割和執行緒排程利用多核CPU 通過功能劃分利用多核
需要由作業系統排程多執行緒使用多核CPU 可以將單執行緒繫結到單核CPU
難以充分利用CPU資源 可以充分利用CPU資源
記憶體軌跡大,資料區域性性弱 記憶體軌跡小,資料區域性性強
符合線性的程式設計思維 不符合傳統程式設計思維