快速掌握Node.js事件驅(qū)動模型
一、傳統(tǒng)線程網(wǎng)絡(luò)模型
在了解Node.js事件驅(qū)動模型之前,我們先了解一下傳統(tǒng)的線程網(wǎng)絡(luò)模型,請求進(jìn)入web服務(wù)器(IIS、Apache)之后,會在線程池中分配一個線程來線性同步完成請求處理,直到請求處理完成并發(fā)出響應(yīng),結(jié)束之后線程池回收。
這就會就會帶來以下幾個問題 :
1.由于線程池中線程個數(shù)有限,對于頻繁請求時,就會出現(xiàn)等待,嚴(yán)重的甚至?xí)逊?wù)器掛掉
2.對于高并發(fā)的時候,為了防止出現(xiàn)臟數(shù)據(jù)就會使用鎖來解決,一些I/O事務(wù)可能消耗很長得時間,這樣就會出現(xiàn)一些線程等待,效率低下

二、事件驅(qū)動模型
1.在Node.js中有一個事件隊(duì)列,每個任務(wù)都會放入事件隊(duì)列中,都會留下處理結(jié)果的回調(diào)函數(shù),事件循環(huán)線程(個人感覺有點(diǎn)類似ios中的RunLoop)處理事件隊(duì)列中的任務(wù),直到回調(diào)函數(shù)不再存在。
2. 在無阻塞的情況下,作為一個帶有回調(diào)的函數(shù)被放入事件隊(duì)列中,事件循環(huán)線程中被提取并執(zhí)行。
3.當(dāng)執(zhí)行過程中遇到I/O阻塞(讀取文件、查詢數(shù)據(jù)庫、請求套接字、訪問遠(yuǎn)程服務(wù)等)時,事件循環(huán)線程不會停下等待結(jié)果,轉(zhuǎn)而繼續(xù)執(zhí)行隊(duì)列中的下一個任務(wù),不會在事件循環(huán)線程中執(zhí)行。在函數(shù)執(zhí)行時,Node.js在事件隊(duì)列中放置回調(diào)函數(shù),它的順序根據(jù)函數(shù)的完成快慢決定。

4.在1中也說了當(dāng)遇到I/O阻塞,循環(huán)線程不會等待結(jié)果,轉(zhuǎn)而執(zhí)行隊(duì)列中的下一個任務(wù),那是該由誰來執(zhí)行這個I/O操作呢?
Node.js使用事件回調(diào)來避免對阻塞I/O的等待,在后臺實(shí)現(xiàn)線程池,當(dāng)遇到I/O阻塞任務(wù)時,會從線程池中獲取一個線程,將該函數(shù)及回調(diào)在那里執(zhí)行,在被阻塞的線程上執(zhí)行的回調(diào)函數(shù)仍然可以把事件添加到事件隊(duì)列中。

以上就是關(guān)于Node.js事件驅(qū)動模型的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
實(shí)戰(zhàn)node靜態(tài)文件服務(wù)器的示例代碼
本篇文章主要介紹了實(shí)戰(zhàn)node靜態(tài)文件服務(wù)器的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Node.js中package.json中庫的版本號(~和^)
這篇文章主要介紹了Node.js中package.json中庫的版本號(~和^),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
基于node.js依賴express解析post請求四種數(shù)據(jù)格式
本篇文章主要介紹了node.js依賴express解析post請求四種數(shù)據(jù)格式,主要是www-form-urlencoded,form-data,application/json,text/xml,有興趣的可以了解一下。2017-02-02
淺析nodejs實(shí)現(xiàn)Websocket的數(shù)據(jù)接收與發(fā)送
WebSocket是HTML5開始提供的一種瀏覽器與服務(wù)器間進(jìn)行全雙工通訊的網(wǎng)絡(luò)技術(shù),本文給大家介紹nodejs實(shí)現(xiàn)websocket的數(shù)據(jù)庫接收與發(fā)送,小伙伴們一起學(xué)習(xí)吧2015-11-11
Nest.js中使用HTTP五種數(shù)據(jù)傳輸方式小結(jié)
本文主要介紹了Nest.js中使用HTTP五種數(shù)據(jù)傳輸方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

