成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

聊聊Node中的異步實現與事件驅動

本篇文章帶大家了解一下Node中的異步實現與事件驅動,希望對大家有所幫助!

聊聊Node中的異步實現與事件驅動

node.js極速入門課程:進入學習

Node的特點

計算機中的一些任務一般可以劃分為兩個類別,一個類別叫做IO密集型,一個叫做計算密集型;對于計算密集型的任務,只能不斷榨干CPU的性能,但是對于IO密集型的任務來說,理想情況下卻并不需要,只需要通知IO設備進行處理,過一段時間再來拿去數據就好了。【相關教程推薦:nodejs視頻教程 、編程視頻】

對于某些場景有一些互不相關的任務需要完成,現行的主流方法有如下兩種:

  • 多線程并行完成:多線程的代價在于創建線程和執行線程上下文切換的開銷較大。另外,在復雜的業務中,多線程編程經常面臨鎖、狀態同步等問題;
  • 單線程順序執行:易于表達,但串行執行的缺點在于性能,任意一個略慢的任務都會導致后續代碼被組設

node在兩者之前給出了它的方案:利用單線程,遠離多線程死鎖、狀態同步等問題;利用異步IO,讓單線程遠離阻塞,以更好地使用CPU

聊聊Node中的異步實現與事件驅動

Node是如何實現異步的

剛才講了node在多任務處理的方案,但是node內部想要實現卻并不容易,下面介紹操作系統的幾個概念,方面后續大家更好理解,后面再講一講異步的實現以及node的事件循環機制:

阻塞IO與非阻塞IO

  • 阻塞IO:應用層面發起IO調用之后,就一直等待數據,等操作系統內核層面完成所有操作后,調用才結束;

操作系統中一切皆文件,輸入輸出設備同樣被抽象為了文件,內核在執行IO操作時,通過文件描述符進行管理

  • 非阻塞IO:差別為調用后立即返回一個文件描述符,并不等待,這時候CPU的時間片就可以用來處理其他事務,之后可以通過這個文件描述符進行結果的獲取;

非阻塞IO存在的一些問題:雖然其讓CPU的利用率提高了,但是由于立即返回的是一個文件描述符,我們并不知道IO操作什么時候完成,為了確認狀態變更,我們只能作輪詢操作

不同的輪詢方法

  • read :最原始、性能最低的一種,通過重復檢查IO狀態來完成完整數據的獲取
  • select:通過對文件描述符上的事件狀態來進行判斷,相對來說消耗更少;缺點就是它采用了一個1024長度的數組來存儲狀態,所以它最多可以同時檢查1024個文件描述符
  • poll:由于select的限制,poll改進為鏈表的存儲方式,其他的基本都一致;但是當文件描述符較多的時候,它的性能還是非常低下的
  • eopll:該方案是linux下效率最高的IO事件通知機制,在進入輪詢的時候如果沒有檢查IO事件,將會進行休眠,直到事件發生將它喚醒
  • kqueue:與epoll類似,不過僅在FreeBSD系統下存在

盡管epoll利用了事件來降低對CPU的耗用,但休眠期間CPU幾乎是閑置的;我們期待的異步IO應該是應用程序發起非阻塞調用,無須通過遍歷或事件喚醒等方式輪詢,可以直接處理下一個任務,只需IO完成后通過信號或者回調將數據傳遞給應用程序即可。

linux下還有中AIO方式就是通過信號或回調來傳遞數據的,不過只有Linux有,并且有限制無法利用系統緩存

node中對于異步IO的實現

先說結論,node對異步IO的實現是通過多線程實現的。可能會混淆的地方就是node內部雖然是多線程的,但是我們程序員開發的JavaScript代碼卻僅僅是運行在單線程上的。

node通過部分線程進行阻塞IO或者非阻塞IO加上輪詢技術來完成數據獲取,讓一個線程進行計算處理,通過線程之間的通信將IO得到的數據進行傳遞,這就輕松實現了異步IO的模擬。

聊聊Node中的異步實現與事件驅動

除了異步IO,計算機中的其他資源也適用,因為linux中一切皆文件,磁盤、硬件、套接字等幾乎所有計算機資源都被抽象為了文件,接下來介紹對計算機資源的調用都以IO為例子。

事件循環

在進程啟動時,node便會創建一個類似與while(true)的循環,每執行一次循環體的過程我們成為Tick

下方為node中事件循環流程圖:

聊聊Node中的異步實現與事件驅動

很簡單的一張圖,簡單解釋一下:就是每次都從IO觀察者里面獲取執行完成的事件(是個請求對象,簡單理解就是包含了請求中產生的一些數據),然后沒有回調函數的話就繼續取出下一個事件(請求對象),有回調就執行回調函數

異步IO細節

聊聊Node中的異步實現與事件驅動

注:不同平臺有不同的細節實現,這張圖隱藏了相關平臺兼容細節,比如windows下使用IOCP中的PostQueuedCompletionStatus()提交執行狀態,通過GetQueuedCompletionStatus獲取執行完成的請求,并且IOCP內部實現了線程池的細節,而linux等平臺通過eopll實現這個過程,并在libuv下自實現了線程池

setTimtoutsetInterval

除了IO等計算機資源需要異步調用之外,node本身還存在一些與異步IO無關的一些其他異步API

  • setTimeout
  • setInterval
  • setImmediate
  • process.nextTick

該小節先講解前面兩個api

它們的實現原理與異步IO比較類似,只是不需要IO線程池的參與

  • setTimtoutsetInterval創建的定時器會被插入到定時器觀察者內部的一個紅黑樹中
  • 每次tick執行的時候,會從該紅黑樹中迭代取出定時器對象,檢查是否超過定時時間
  • 如果超過,就將這個事件(請求對象)推入到事件隊列中,在事件循環中執行其中的回調函數

紅黑樹:這里簡單提一下,就是一種特殊化的平衡二叉樹,可以自平衡,查找效率基本上就是該二叉樹的深度了

O(log2n)O(log_2n)

你有考慮過這個問題嗎,為什么定時器不需要線程池的參與了呢,如果你理解了之前章節對于異步IO實現原理的話,相信你應該能解釋出來,這里簡單說說原因來加深記憶:

node中的IO線程池是用來調用IO并等待數據返回(看具體實現)的一種方式,它使JavaScript單線程得以異步調用IO,并且不需要等待IO執行完成(因為是IO線程池做了),并且能獲取到最終的數據(通過觀察者模式:IO觀察者從線程池獲取執行完成的事件,事件循環機制執行后續的回調函數)

上述這段話可能有點簡略,如果你還不明白,可以看下之前的那幾種圖~

process.nextTicksetImmediate

這兩個函數都是代表立即異步執行一個函數,那為什么不用setTimeout(() => { ... }, 0)來完成呢?

  • 定時器精度不夠
  • 定時器使用紅黑樹來創建定時器對象和迭代操作,浪費性能
  • process.nextTick更加輕量

輕量具體來說:我們在每次調用process.nextTick的時候,只會將回調函數放入隊列中,在下一輪Tick時取出執行。定時器中采用紅黑樹的方式時

O(log2n)O(log_2n)

nextTick

O(1)O(1)

process.nextTicksetImmediate又有什么區別呢?畢竟它們都是將回調函數立即異步執行

  • process.nextTick的回調執行優先級高于setImmediate
  • process.nextTick的回調函數保存在一個數組中,每輪事件循環下全部執行,setImmediate的結果則是保存在鏈表中,每輪循環按序執行第一個回調

注意:之所以process.nextTick的回調執行優先級高于setImmediate,因為事件循環對觀察者的檢查是有順序的,process.nextTick屬于idle觀察者,setImmediate屬于check觀察者。iedl觀察者 > IO 觀察者 > check觀察者

高性能服務器

對于網絡套接字的處理,node也應用到了異步IO,網絡套接字上偵聽到的請求都會形成事件交給IO觀察者,事件循環會不停地處理這些網絡IO事件,如果我們在JavaScrpt層面上有傳入對應的回調函數,這些回調函數就會在事件循環中執行(處理這些網絡請求)

常見的服務器模型:

  • 同步式
  • 每進程–>每請求
  • 每線程–>每請求

node采用的是事件驅動的方式處理這些請求,無需對每個請求創建額外的對應線程,可以省略掉創建線程和銷毀線程的開銷,同時操作系統的調度任務因為線程較少(只有node內部實現的一些線程)上下文切換的代價很低。

經典問題–雪崩問題的解決:

問題描述:服務器在剛啟動時,緩存無數據,如果訪問量巨大,同一條SQL會被發送到數據庫中反復查詢,影響性能。

解決方案:

const proxy = new events.EventEmitter(); let status = "ready"; // 狀態鎖,避免反復查詢  const select = function(callback) {     proxy.once("selected", callback);  // 綁定一個只執行一次名為selected的事件     if(status === "ready") {         status = "pending";         // sql         db.select("SQL", (res) => {             proxy.emit("selected", res); // 觸發事件,返回查詢數據             status = "ready";         })     } }
登錄后復制

使用once將所有請求的回調都壓入了事件隊列中,利用其只執行一次就會將監視器移除的特點,保證每一個回調函數只會被執行一次。對于相同的SQL語句,保證在同一個查詢開始到結束的過程中永遠只有一次。新到來的相同調用只需在隊列中等待數據就緒即可,一旦查詢到結果,得到的結果就可以被這些調用共同使用。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
日韩无套内射视频6| 日本JAPANESE 办公室丝| 男人边吃奶边揉好爽免费视频 | 麻豆果冻传媒精品国产AV| 男生坤坤放在女生坤坤里开元棋| 欧美人与禽Z0ZO牲伦交| 日产无人区一线二线三线新版| 特殊重囗味SM在线观看无码| 无罩大乳的熟妇正在播放| 亚洲成AV人片一区二区小说| 游泳教练在水里含我奶小说| CHRISTMAS农村夫妻HO| 大码HIPHOP欧美胖MM短袖| 国产美女视频免费观看| 精品无人区卡一卡二卡三| 免费体验120秒视频| 任你躁久久精品6| 无码AV无码一区二区| 亚洲精品无码AMM毛片| 中文WWW新版资源在线| 被主人调教边C边打屁股作文 | 铜铜铜铜铜铜铜铜铜好多水| 亚洲国产中文在线二区三区免| 中文无码AV电影在线观看网站| 啊灬啊别停灬用力啊无码视频| 国产精品成人A区在线观看| 精品无码人妻一区二区三区不卡| 浓毛BGMBGMBGM胖老太太| 色一情一乱一伦一区二区三区小说| 午夜福利理论片高清在线观看| 亚洲爽爆东京爽爆东京爽爆av| 99国产精品久久久久久久成人热| 国产99网站免在线观看| 精品亚洲国产成AV人片传媒| 欧美色欧美亚洲高清在线观看 | 公与2个熄乱理在线播放| 机长脔到她哭H粗话H动漫| 男人扒开女人的腿做爽爽视频| 少妇爆乳无码专区网站| 亚洲欧美日韩国产成人精品影院| AV日日碰狠狠躁久久躁| 国产乱人伦偷精品视频色欲| 美国ZOOM动物| 熟女内射婷婷直播| 野花日本大全免费观看版动漫| 成码无人AV片在线观看网站| 狠狠色丁香久久综合婷婷| 欧美日本精品一区二区三区| 亚洲av成人一区| 99久久免费国产精品四虎| 国产麻花豆剧传媒精品MV| 内射猛交XXXXⅩX最新消息| 小SB几天没做又欠CH| 91精品人妻一区二区三区| 国产人成无码视频在线| 欧美XXXX色视频在线观看| 亚洲AV成人无码AV小说| METART极品人体| 精品人妻系列无码人妻不卡 | 亚洲AV无码专区色爱天堂| JEAⅠOUSVUE成熟少归| 精品国产污污免费网站AⅤ| 日本熟妇大屁股人妻| 亚洲午夜久久久久妓女影院| 国产CHINESEHDXXXX宾馆TUBE| 狼友AV永久网站在线观看| 无码高潮爽到爆的喷水视频| 在线 | 麻豆国产传媒| 国产久热精品无码激情| 欧美激情一区二区三区蜜桃 | 极品教师动漫在线观看免费完整版 | 妺妺窝人体色777777换脸| 性生交片免费无码看人| 把女的下面扒开添视频| 久久精品熟女亚洲AV噜噜| 玩弄人妻少妇500系列网址| AV无码久久久久不卡免费网站| 精品国内自产拍在线观看| 少妇人妻好深太紧了A| 2021久久天天躁狠狠躁夜夜 | 高清欧美性猛XXXX黑人| 免费无人区一码二码乱码| 亚洲成A人片在线不卡一二三区| 成人欧美一区二区三区1314| 蜜桃久久久久久精品免费观看 | 51精品人人搡人妻人人玩| 加比勒色综合久久| 无码AV大香线蕉| 差差差很疼视频30分钟应用| 蜜臂无码AV在线| 亚洲区激情区无码区| 国产精品毛多多水多| 日本亲近相奷中文字幕视频| 综合无码精品人妻一区二区三区| 精品久久久久中文字幕APP| 无码AⅤ最新AV无码专区| 成人乱码一区二区三区四区| 欧美XXXX做受欧美88BBW| 亚洲性色AV性色在线观看| 国产在线观看无码免费视频| 四虎影视国产精品久久| 成年大片免费视频播放| 欧美粗大猛烈老熟妇| 再深点灬舒服灬太大了添视频软件| 激情无码人妻又粗又大| 小东西好几天没弄了还能吃吗 | 玩弄中国白嫩少妇HD乱| 大J8黑人BBW巨大888| 秋霞鲁丝片AⅤ无码入口| 91人妻一区二区三区蜜桃| 狂野欧美激情性XXXX在线观看| 亚洲AV综合A∨一区二区| 国产欧美日韩一区二区加勒比| 爽到高潮无码视频在线观看| 岛国无码AV不卡一区二区| 日本免费人成视频播放试看| 精产国品一二三区别9978| 欧美多人片高潮野外做片黑人| 成熟丰满熟妇自慰XXXXX| 男女狂进狂出动态图| 一本久道综合在线中文无码 | 九九在线中文字幕无码| 午夜亚洲国产理论片中文飘花 | 色偷偷AV老熟女| 成人精品一区二区三区在线观看| 欧美亚洲国产一区二区三区| FREEⅩXX性欧美HD丝袜| 女女互磨互喷水高潮LES呻吟| 中文区中文字幕免费看| 毛很浓密超多黑毛| ◇一本大道香蕉中文在线| 毛片无遮挡高清免费| 最新国产毛2卡3卡4卡| 男朋友想吻我腿中间那个部位 | 亚洲色欲色欲色欲WWW| 久久99精品久久久久免费| 亚洲熟妇无码AV不卡在线播放| 精品无码综合一区二区三区| 亚洲熟妇色XXXXX中国少妇Y| 久久久久99精品成人片| 喑交小拗女一区二区三区| 美女露内裤扒开腿让男人桶无遮挡 | 午夜成人亚洲理伦片在线观看| 国产乱人伦偷精品视频免| 亚洲AV无码精品色午夜蜜芽| 极品粉嫩嫩模大尺度无码视频| 亚洲热妇无码AV在线播放| 久久久久人妻精品一区蜜桃| 征服贵妇内射在线| 欧美人妻精品一区二区免费看 | 人善交VIDE欧美| 各种少妇正面着BBW撒尿视频| 无码高潮爽到爆的喷水视频APP| 国产在线看片无码人精品| 亚洲娇小与黑人巨大video| 久久精品国产亚洲AV麻豆长发| 中文字幕日韩人妻在线乱码| 欧美人与禽ZOZ0性伦交| 多P混交群体交乱的安全保障| 乌鸦传媒一二三区| 黄 色 网 站 在 线 免费 | 久久国产成人精品国产成人亚洲| 在线观看无码H片| 99精品又大又爽又粗少妇毛片| 日韩成人一区二区三区在线观看| 国产成人无码VA在线观看| 五十路熟妇亲子交尾| 精品无码黑人又粗又大又长AV| 中文精品久久久久鬼色| 欧美性爱AAAAA| 国产99视频精品免费视频6| 亚欧乱色熟女一区二区三区| 久久久久99精品成人片直播| 99久久亚洲综合精品成人网| 三级 丰满 人妻 少妇| 国产欧美日韩精品A在线观看| 亚洲色AV无码AV丰满AV| 欧美疯狂做受XXXX| 国产98色在线 | 免费| 亚洲成AV人片天堂网久久| 美女床上喷水在线观看| 成人无码精品一区二区三区亚洲区 | 日日狠狠久久偷偷色综合免费| 国产无遮挡又黄又爽在线观看| 又大又长粗又爽又黄少妇视频| 秋霞在线观看视频| 国产精品制服一区二区| 一区二区三区AV波多野结衣| 日本XXWWWXXXX| 哈昂~哈昂够了太多了老师| 中文字幕精品亚洲人成在线| 色噜噜人妻丝袜aV先锋影音先| 国内精品国产成人国产三级| 一面亲上边一面膜| 上课我穿超短裙被同桌摸出水| 国产又粗又黄又爽的大片| 中文字字幕在线中文无码| 无码成人一区二区| 老妇饥渴XXHDⅩXXOOO| 寡妇大J8又粗又大|