1. 程式人生 > 程式設計 >Node中對非阻塞I/O、事件迴圈的知識點總結

Node中對非阻塞I/O、事件迴圈的知識點總結

Node.js的主要特點

單執行緒、非阻塞I/O、事件驅動,這三個特點是相輔相成的。

Node為了在低硬體伺服器條件下高併發,所以減少了記憶體消耗,選擇單執行緒;

因為只有一個執行緒,所以必須非阻塞I/O,每件事情都有回撥函式;

為了合理排程,Node使用了事件環的機制,採用事件驅動來排程事件。

非阻塞I/O

I/O是輸入(input)、輸出(output)的簡稱。

阻塞I/O和非阻塞I/O的區別在於系統在輸入與輸出的期間,能不能接收輸入。

舉個例子:餐廳服務員招待客人

阻塞I/O:餐廳有多個服務員(多執行緒),一個服務員對應一個客人,客人從點菜到點菜結束的期間,服務員都會被閒置不做任何事情,直到這桌客人點完菜,服務員才能招待下一桌客人。

非阻塞I/O:餐廳有一個服務員(單執行緒),服務員招待一桌客人時,對客人說:“你先看下選單,好了就叫我”。然後前往下一桌繼續招待,等到一桌客人點完菜後,服務員再過去處理,如此反覆,效率大大提高。

但也不能證明非阻塞I/O是一定好的,比如服務員中間發生意外,所有的客人都要等這一個服務員,這樣就會影響餐廳整體質量(可以理解為伺服器奔潰);
阻塞I/O由於有多個服務員,一對一的服務,即使有一個發生意外,也不會影響整體質量,而僱多個服務員也要相應的付出成本。

所以沒有最好的選擇,只有適合的選擇,Node.js本身的應用場景就是I/O操作越多優勢越明顯,但安全性也會下降。

事件迴圈

事件迴圈是 Node.js 處理非阻塞 I/O 操作的機制,也是實現非阻塞I/O的前提基礎。

非阻塞I/O在每個事情上都註冊有回撥函式,當其中的一個事情完成的時候,通知 Node.js 將適合的回撥函式新增到輪詢佇列中等待時機執行。

簡單來說就是Node.js會每隔一段時間檢查一下佇列中的回撥函式,看看有沒有完成的回撥函式,如果有就輸出結果。

就像上面非阻塞I/O的例子一樣,服務員在服務下一桌客人時,會時刻留意上一桌客人的情況。當客人點完菜會通知服務員說:“我點完菜了”,服務員收到後說:“好的,我知道了”,然後將這桌的號碼記到本子上(回撥函式新增到輪詢佇列)。等到上菜時,也會按照本子上記錄的順序為客人上菜

以上知識點比較直白一些,大家如果有任何補充和意見可以聯絡我們的小編。