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