摘要:一旦為空事件循環(huán)將檢查,如果一個(gè)或多個(gè)定時(shí)器準(zhǔn)備就緒,事件循環(huán)將回繞到階段以執(zhí)行那些的回調(diào)。此階段允許人員在輪詢階段完成后立即執(zhí)行回調(diào)。否則它將通過發(fā)射。
什么是Event Loop?
官網(wǎng)解釋
個(gè)人理解是js的單線程是他的任務(wù)棧是單線程,但他處理異步i/o的方法是依賴libuv開啟線程池去處理,完成之后任務(wù)加到poll queue里,然后等任務(wù)棧的任務(wù)為空或事件到達(dá)閥值時(shí),把poll queue和定時(shí)器的任務(wù)加到任務(wù)棧里,繼續(xù)這個(gè)循環(huán),這就是大體上的js的Event Loop。
結(jié)構(gòu)
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
timer:
定時(shí)任務(wù),當(dāng)?shù)竭_(dá)閥值時(shí),他不會立即執(zhí)行,會等待任務(wù)棧的任務(wù)會阻塞他。
pending callbacks:
此階段執(zhí)行某些系統(tǒng)操作(例如TCP錯(cuò)誤類型)的回調(diào)。例如,如果TCP套接字在嘗試連接時(shí)收到,則某些*nix系統(tǒng)希望等待報(bào)告錯(cuò)誤。這將排隊(duì)等待在掛起的回調(diào)階段執(zhí)行。
pull:
這個(gè)階段有兩個(gè)主要功能:
計(jì)算它應(yīng)該阻塞和輪詢I / O的時(shí)間,然后
處理輪詢隊(duì)列中的事件。
當(dāng)事件循環(huán)進(jìn)入輪詢階段并且沒有計(jì)劃定時(shí)器時(shí),將發(fā)生以下兩種情況之一:
如果輪詢隊(duì)列不為空,則事件循環(huán)將遍歷其同步執(zhí)行它們的回調(diào)隊(duì)列,直到隊(duì)列已用盡,或者達(dá)到系統(tǒng)相關(guān)的硬限制。
如果輪詢隊(duì)列為空,則會發(fā)生以下兩種情況之一:
如果腳本已執(zhí)行setImmediate,則事件循環(huán)將結(jié)束poll階段并繼續(xù)執(zhí)行check階段以執(zhí)行這些調(diào)度腳本。
如果腳本沒有執(zhí)行setImmediate,事件循環(huán)將等待回調(diào)被添加到poll queue中,然后立即執(zhí)行。
一旦poll queue為空事件循環(huán)將檢查timer,如果一個(gè)或多個(gè)定時(shí)器準(zhǔn)備就緒,事件循環(huán)將回繞到timer階段以執(zhí)行那些timer的回調(diào)。
check
此階段允許人員在輪詢階段完成后立即執(zhí)行回調(diào) 。如果輪詢階段變?yōu)榭臻e并且存在setImmediate任務(wù),那么事件循環(huán)直接跳到check執(zhí)行而不是阻塞在poll階段等待回調(diào)被加入。
setImmediate實(shí)際上是一個(gè)特殊的計(jì)時(shí)器,它在事件循環(huán)的一個(gè)多帶帶階段運(yùn)行。它使用libuv API來調(diào)度在輪詢階段完成后執(zhí)行的回調(diào)。
close callbacks
如果socket或handle突然關(guān)閉(例如socket.destroy()),則該 "close"事件將在此階段發(fā)出。否則它將通過發(fā)射process.nextTick()。
引用:
https://nodejs.org/en/docs/gu...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102988.html
摘要:同時(shí),如果執(zhí)行的過程中發(fā)現(xiàn)其他函數(shù),繼續(xù)入棧然后執(zhí)行。上面我們討論的其實(shí)都是同步代碼,代碼在運(yùn)行的時(shí)候只用調(diào)用棧解釋就可以了。 序 Event Loop 這個(gè)概念相信大家或多或少都了解過,但是有一次被一個(gè)小伙伴問到它具體的原理的時(shí)候,感覺自己只知道個(gè)大概印象,于是計(jì)劃著寫一篇文章,用輸出倒逼輸入,讓自己重新學(xué)習(xí)這個(gè)概念,同時(shí)也能幫助更多的人理解它~ 概念 JavaScript 是一門 ...
摘要:常見應(yīng)用則是為了完成一些更新應(yīng)用程序狀態(tài)的較小的任務(wù),如處理的回調(diào)和的修改,以便讓這些任務(wù)在瀏覽器重新渲染之前執(zhí)行。常見應(yīng)用執(zhí)行順序的實(shí)現(xiàn)需要至少一個(gè)和至少一個(gè)。 簡介 我們在上一篇 《淺析 JS 中的EventLoop 事件循環(huán)》 中提到一個(gè) Event Queue,其實(shí)在事件循環(huán)中 queue 一共有兩種,還有一種叫 Job Queue 其中 Event Queue 在 HTML...
摘要:單線程的好處簡單,處理時(shí)不會出現(xiàn)并發(fā)競爭問題異步的必要性讓用戶體驗(yàn)更流暢如何實(shí)現(xiàn)異步見參考,,調(diào)用棧函數(shù)執(zhí)行上下文。單線程只能有一個(gè)并且每次只能執(zhí)行一個(gè)任務(wù)。 參考: JavaScript 運(yùn)行機(jī)制詳解:再談Event Loop 深入理解JavaScript的執(zhí)行過程--單線程的JS 細(xì)說JavaScript單線程的一些事 The JavaScript Event Loop: Exp...
摘要:而在單線程環(huán)境下,繞不過錯(cuò)誤就意味著導(dǎo)致應(yīng)用退出,重啟恢復(fù)的間隙會導(dǎo)致服務(wù)中斷,這是我們不愿意看到的。這也是支持高并發(fā)的重要原因之一實(shí)際上不光是操作,的絕大多數(shù)操作都是以這種異步的方式進(jìn)行的。 本文首發(fā)于我的個(gè)人博客: kmknkk.xin 不足之處歡迎斧正! Node特性:高并發(fā) 在解釋node為什么能夠做到高并發(fā)之前,不妨先了解一下node的其他幾個(gè)特性: 單線程 我們先來明確...
摘要:心塞塞根據(jù)規(guī)范,事件循環(huán)是通過任務(wù)隊(duì)列的機(jī)制來進(jìn)行協(xié)調(diào)的。等便是任務(wù)源,而進(jìn)入任務(wù)隊(duì)列的是他們指定的具體執(zhí)行任務(wù)回調(diào)函數(shù)。然后當(dāng)前本輪的結(jié)束,主線程可以繼續(xù)取下一個(gè)執(zhí)行。 依然是:經(jīng)濟(jì)基礎(chǔ)決定上層建筑。 說明 首先,旨在搞清常用的同步異步執(zhí)行機(jī)制 其次,暫時(shí)不討論node.js的Event Loop執(zhí)行機(jī)制,以下關(guān)于瀏覽器的Event Loop執(zhí)行機(jī)制 最后,借鑒了很多前輩的研究文...
閱讀 2068·2021-11-23 09:51
閱讀 3360·2021-09-28 09:36
閱讀 1133·2021-09-08 09:35
閱讀 1775·2021-07-23 10:23
閱讀 3272·2019-08-30 15:54
閱讀 3008·2019-08-29 17:05
閱讀 448·2019-08-29 13:23
閱讀 1304·2019-08-28 17:51