一、傳統線程網絡模型
在了解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事件驅動模型的全部內容,希望對大家的學習有所幫助。
新聞熱點
疑難解答