一、傳統執行緒網路模型
在了解Node.js事件驅動模型之前,我們先了解一下傳統的線程網路模型,請求進入web伺服器(IIS、Apache)之後,會在線程池中分配一個線程來線性同步完成請求處理,直到請求處理完成並發出回應,結束之後線程池回收。
這就會帶來以下幾個問題 :
1.由於執行緒池中執行緒個數有限,對於頻繁請求時,就會出現等待,嚴重的甚至會把伺服器掛掉
2.對於高並發的時候,為了防止出現髒數據就會使用鎖來解決,一些I/O事務可能消耗很長得時間,這樣就會出現一些線程等待,效率低下
二、事件驅動模型
1.在Node.js中有一個事件隊列,每個任務都會放入事件隊列中,都會留下處理結果的回調函數,事件循環線程(個人感覺有點類似ios中的RunLoop)處理事件隊列中的任務,直到回調函數不再存在。
2. 在無阻塞的情況下,作為一個帶有回調的函數被放入事件隊列中,事件循環線程中被提取並執行。
3.執行過程中遇到I/O阻塞(讀取檔案、查詢資料庫、請求套接字、存取遠端服務等)時,事件循環執行緒不會停下等待結果,轉而繼續執行佇列中的下一個任務,不會在事件循環線程中執行。在函數執行時,Node.js在事件佇列中放置回調函數,它的順序根據函數的完成快慢決定。
4.在1中也說了當遇到I/O阻塞,循環線程不會等待結果,轉而執行隊列中的下一個任務,那是該由誰來執行這個I/O操作呢?
Node.js使用事件回調來避免對阻塞I/O的等待,在後台實現線程池,當遇到I/O阻塞任務時,會從線程池中獲取一個線程,將該函數及回調在那裡執行,在被阻塞的執行緒上執行的回呼函數仍然可以把事件加入到事件佇列中。
以上就是關於Node.js事件驅動模型的全部內容,希望對大家的學習有所幫助。