1. 程式人生 > >nodejs 之非阻塞 I/O、非同步、事件驅動

nodejs 之非阻塞 I/O、非同步、事件驅動

在 JavaPHP 或者.net 等伺服器端語言中,會為每一個客戶端連線建立一個新的執行緒。 而每個執行緒需要耗費大約 2MB 記憶體。也就是說,理論上,一個 8GB 記憶體的伺服器可以同時 連線的最大使用者數為 4000 個左右。要讓 Web 應用程式支援更多的使用者,就需要增加伺服器 的數量,而 Web 應用程式的硬體成本當然就上升了。

Node.js 不為每個客戶連線建立一個新的執行緒,而僅僅使用一個執行緒。當有使用者連線了, 就觸發一個內部事件,通過非阻塞 I/O、事件驅動機制,讓 Node.js 程式巨集觀上也是並行的。使用 Node.js,一個 8GB 記憶體的伺服器,可以同時處理超過 

萬用戶的連線

Node.js 幾乎每一個 API 都是支援回撥函式的。

Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。

Node.js 單執行緒類似進入一個while(true)的事件迴圈,直到沒有事件觀察者退出,每個非同步事件都生成一個事件觀察者,如果有事件發生就呼叫該回調函式.

事件驅動程式

Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。

當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。

這個模型非常高效可擴充套件性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)

在事件驅動模型中,會生成一個主迴圈來監聽事件,當檢測到事件時觸發回撥函式。

整個事件驅動的流程就是這麼實現的,非常簡潔。有點類似於觀察者模式,事件相當於一個主題(Subject),而所有註冊到這個事件上的處理函式相當於觀察者(Observer)。

Node.js 有多個內建的事件,我們可以通過引入 events 模組,並通過例項化 EventEmitter 類來繫結和監聽事件