第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Nodejs事件循環(huán)

Nodejs事件循環(huán)

鳳凰求蠱 2019-07-31 14:38:36
Nodejs事件循環(huán)nodejs架構(gòu)內(nèi)部有兩個(gè)事件循環(huán)嗎?libev / libuvv8 javascript事件循環(huán)在I / O請(qǐng)求上,節(jié)點(diǎn)將請(qǐng)求排隊(duì)到libeio,后者又通過使用libev的事件通知數(shù)據(jù)的可用性,最后這些事件是由v8事件循環(huán)使用回調(diào)來處理的嗎?基本上,libev和libeio如何集成在nodejs架構(gòu)中?有沒有可用于提供nodejs內(nèi)部架構(gòu)清晰圖片的文檔?
查看完整描述

3 回答

?
喵喵時(shí)光機(jī)

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊

看起來所討論的一些實(shí)體(例如:libev等)已經(jīng)失去了相關(guān)性,因?yàn)樗呀?jīng)有一段時(shí)間了,但我認(rèn)為這個(gè)問題仍然具有很大的潛力。

讓我嘗試在抽象的UNIX環(huán)境中,在Node的上下文中,借助抽象示例來解釋事件驅(qū)動(dòng)模型的工作。

計(jì)劃的觀點(diǎn):

  • 腳本引擎開始執(zhí)行腳本。

  • 每當(dāng)遇到CPU綁定操作時(shí),它都會(huì)在內(nèi)聯(lián)(真實(shí)機(jī)器)中完成。

  • 每當(dāng)遇到I / O綁定操作時(shí),請(qǐng)求及其完成處理程序都會(huì)在“事件機(jī)器”(虛擬機(jī))中注冊(cè)

  • 以相同的方式重復(fù)操作,直到腳本結(jié)束。CPU綁定操作 - 執(zhí)行內(nèi)聯(lián),I / O綁定操作,如上所述向機(jī)器請(qǐng)求。

  • 當(dāng)I / O完成時(shí),將回調(diào)一下監(jiān)聽器。

上面的事件機(jī)制稱為libuv AKA事件循環(huán)框架。Node利用此庫(kù)來實(shí)現(xiàn)其事件驅(qū)動(dòng)的編程模型。

Node的觀點(diǎn):

  • 有一個(gè)線程來托管運(yùn)行時(shí)。

  • 拿起用戶腳本。

  • 將其編譯為本機(jī)[杠桿v8]

  • 加載二進(jìn)制文件,然后跳轉(zhuǎn)到入口點(diǎn)。

  • 已編譯的代碼使用編程原語在線執(zhí)行CPU綁定活動(dòng)。

  • 許多I / O和計(jì)時(shí)器相關(guān)的代碼都有本機(jī)包裝。例如,網(wǎng)絡(luò)I / O.

  • 因此,I / O調(diào)用從腳本路由到C ++橋接器,I / O句柄和完成處理程序作為參數(shù)傳遞。

  • 本機(jī)代碼執(zhí)行l(wèi)ibuv循環(huán)。它獲取循環(huán),將表示I / O的低級(jí)事件排入隊(duì)列,并將本機(jī)回調(diào)包裝器排入libuv循環(huán)結(jié)構(gòu)。

  • 本機(jī)代碼返回到腳本 - 此刻不會(huì)發(fā)生I / O!

  • 上面的項(xiàng)目重復(fù)多次,直到執(zhí)行所有非I / O代碼,并且所有I / O代碼都被注冊(cè)到libuv。

  • 最后,當(dāng)系統(tǒng)中沒有任何內(nèi)容要執(zhí)行時(shí),節(jié)點(diǎn)將控制權(quán)傳遞給libuv

  • libuv開始行動(dòng),它獲取所有已注冊(cè)的事件,查詢操作系統(tǒng)以獲得其可操作性。

  • 在非阻塞模式下準(zhǔn)備好I / O的那些被拾取,執(zhí)行I / O,并且發(fā)出它們的回調(diào)。一個(gè)接一個(gè)地。

  • 尚未準(zhǔn)備好的那些(例如套接字讀取,另一個(gè)端點(diǎn)尚未寫入任何內(nèi)容)將繼續(xù)用OS進(jìn)行探測(cè),直到它們可用。

  • 循環(huán)內(nèi)部維持一個(gè)不斷增加的計(jì)時(shí)器。當(dāng)應(yīng)用程序請(qǐng)求延遲回調(diào)(例如setTimeout)時(shí),將利用此內(nèi)部計(jì)時(shí)器值來計(jì)算觸發(fā)回調(diào)的正確時(shí)間。

雖然大多數(shù)功能都以這種方式迎合,但文件操作的一些(異步版本)是在附加線程的幫助下執(zhí)行的,并且很好地集成到libuv中。雖然網(wǎng)絡(luò)I / O操作可以等待期望外部事件,例如另一個(gè)端點(diǎn)響應(yīng)數(shù)據(jù)等,但文件操作需要來自節(jié)點(diǎn)本身的一些工作。例如,如果你打開一個(gè)文件并等待fd準(zhǔn)備好數(shù)據(jù),它就不會(huì)發(fā)生,因?yàn)闆]有人正在閱讀!同時(shí),如果您從主線程中的內(nèi)聯(lián)文件中讀取,它可能會(huì)阻止程序中的其他活動(dòng),并且可能會(huì)產(chǎn)生可見問題,因?yàn)榕ccpu綁定活動(dòng)相比,文件操作非常慢。因此,內(nèi)部工作線程(可通過UV_THREADPOOL_SIZE環(huán)境變量配置)用于對(duì)文件進(jìn)行操作,

希望這可以幫助。


查看完整回答
反對(duì) 回復(fù) 2019-07-31
?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

ibuv簡(jiǎn)介

該Node.js的項(xiàng)目開始于2009年從瀏覽器分離一個(gè)JavaScript環(huán)境。使用谷歌的V8和Marc Lehmann的libev,node.js將I / O模型 - 偶數(shù) - 與一種非常適合編程風(fēng)格的語言相結(jié)合; 由于瀏覽器的形成方式。隨著node.js越來越流行,讓它在Windows上運(yùn)行很重要,但libev只能在Unix上運(yùn)行。Windows等效的內(nèi)核事件通知機(jī)制(如kqueue或(e)輪詢)是IOCP。libuv是一個(gè)圍繞libev或IOCP的抽象,取決于平臺(tái),為用戶提供基于libev的API。在node-v0.9.0版本的libuv中,libev被刪除了。

還有一張用@ BusyRich描述Node.js中的事件循環(huán)的圖片

根據(jù)這個(gè)doc Node.js事件循環(huán),


下圖顯示了事件循環(huán)操作順序的簡(jiǎn)要概述。



   ┌───────────────────────┐

┌─>│        timers         │

│  └──────────┬────────────┘

│  ┌──────────┴────────────┐

│  │     I/O callbacks     │

│  └──────────┬────────────┘

│  ┌──────────┴────────────┐

│  │     idle, prepare     │

│  └──────────┬────────────┘      ┌───────────────┐

│  ┌──────────┴────────────┐      │   incoming:   │

│  │         poll          │<─────┤  connections, │

│  └──────────┬────────────┘      │   data, etc.  │

│  ┌──────────┴────────────┐      └───────────────┘

│  │        check          │

│  └──────────┬────────────┘

│  ┌──────────┴────────────┐

└──┤    close callbacks    │

   └───────────────────────┘


注意:每個(gè)框?qū)⒈环Q為事件循環(huán)的“階段”。


階段概述


定時(shí)器:此階段執(zhí)行由setTimeout()和調(diào)度的回調(diào)setInterval()。

I / O回調(diào):除了執(zhí)行幾乎所有回調(diào)之外

關(guān)閉回調(diào),由計(jì)時(shí)器安排的回調(diào),和setImmediate()??臻e,準(zhǔn)備:僅在內(nèi)部使用。

poll:檢索新的I / O事件; 節(jié)點(diǎn)將在適當(dāng)時(shí)阻止此處。

check:setImmediate()在這里調(diào)用回調(diào)。

關(guān)閉回調(diào):例如socket.on('close', ...)。

在事件循環(huán)的每次運(yùn)行之間,Node.js檢查它是否在等待任何異步I / O或定時(shí)器,如果沒有,則檢查是否干凈。


查看完整回答
反對(duì) 回復(fù) 2019-07-31
  • 3 回答
  • 0 關(guān)注
  • 767 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)