NodeJs事件驅動和非阻塞機制詳解
NodeJs強調錯誤優先
- 因為事件的操作大多數都是異步的方式,無法通過try catch捕獲異常
- 采用錯誤優先的回調函數
NodeJs基本介紹(菜鳥教程)
- Node.js 是單進程單線程應用程序,但是通過事件和回調支持并發,所以性能非常高。
- Node.js 的每一個 API 都是異步的,并作為一個獨立線程運行,使用異步函數調用,并處理并發。
- Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。
- Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數。
NodeJs事件驅動機制
Nginx的服務原理類似,Node采用事件驅動的運行方式。不過nginx式多進程單線程,而Node通過事件驅動的方式處理請求時無需為每一個請求創建額外的線程。在事件驅動的模型當中,每一個IO工作被添加到事件隊列中,線程循環地處理隊列上的工作任務,當執行過程中遇到來堵塞(讀取文件、查詢數據庫)時,線程不會停下來等待結果,而是留下一個處理結果的回調函數,轉而繼續執行隊列中的下一個任務。這個傳遞到隊列中的回調函數在堵塞任務運行結束后才被線程調用
前面也說過Node Async IO = CPS + Callback,這一套實現開始于Node開始啟動的進程,在這個進程中Node會創建一個循環,每次循環運行就是一個Tick周期,每個Tick周期中會從事件隊列查看是否有事件需要處理,如果有就取出事件并執行相關的回調函數。事件隊列事件全部執行完畢,node應用就會終止。Node對于堵塞IO的處理在幕后使用線程池來確保工作的執行。Node從池中取得一個線程來執行復雜任務,而不占用主循環線程。這樣就防止堵塞IO占用空閑資源。當堵塞任務執行完畢通過添加到事件隊列中的回調函數來處理接下來的工作。
mark
自己的描述
- Node是一個單線程的語言,采用事件驅動和異步回調的機制。在執行代碼的時候,主線程從上往下依次執行,遇到有需要回調的地方,就將此處加入到事件隊列中,然后主線程繼續往下走,直到運行結束以后,才去執行事件隊列中的回調
- node去執行事件隊列中的事件時,如果遇到回調,依然是按照順序添加進入事件隊列,主線程一次往下執行,遇到回調就添加,直至執行完畢。
- node是一個單線程多進程的。node進程創建一個循環,每個循環就是一個周期,在循環中會從事件隊列里查看是否有事件需要處理,如果有就去除事件并執行相關的函數。對于阻塞事件的處理在幕后使用線程池來確保工作的運行,而不占用主循環流程。
NodeJs非阻塞機制
(mark
)