nodejs 之非阻塞 I/O、非同步、事件驅動
在 Java、PHP 或者.net 等伺服器端語言中,會為每一個客戶端連線建立一個新的執行緒。 而每個執行緒需要耗費大約 2MB 記憶體。也就是說,理論上,一個 8GB 記憶體的伺服器可以同時 連線的最大使用者數為 4000 個左右。要讓 Web 應用程式支援更多的使用者,就需要增加伺服器 的數量,而 Web 應用程式的硬體成本當然就上升了。
Node.js 不為每個客戶連線建立一個新的執行緒,而僅僅使用一個執行緒。當有使用者連線了, 就觸發一個內部事件,通過非阻塞 I/O、事件驅動機制,讓 Node.js 程式巨集觀上也是並行的。使用 Node.js,一個 8GB 記憶體的伺服器,可以同時處理超過 4
Node.js 幾乎每一個 API 都是支援回撥函式的。
Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。
Node.js 單執行緒類似進入一個while(true)的事件迴圈,直到沒有事件觀察者退出,每個非同步事件都生成一個事件觀察者,如果有事件發生就呼叫該回調函式.
事件驅動程式
Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。
當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。
這個模型非常高效可擴充套件性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)
整個事件驅動的流程就是這麼實現的,非常簡潔。有點類似於觀察者模式,事件相當於一個主題(Subject),而所有註冊到這個事件上的處理函式相當於觀察者(Observer)。
Node.js 有多個內建的事件,我們可以通過引入 events 模組,並通過例項化 EventEmitter 類來繫結和監聽事件