摘要:輪詢投票處理下一次處理的新事件立即設(shè)置運行通過注冊的所有回調(diào)關(guān)閉執(zhí)行所有的回調(diào)工作處理延遲此度量標(biāo)準(zhǔn)測量線程池處理異步任務(wù)需要多長時間。高工作時間處理延遲表明繁忙耗盡的線程池。
原文=> What you should know to really understand the Node.js Event Loop
Node.js 是一個基于事件的平臺。這就意味著在Node中發(fā)生的所有事情都是對事件的反應(yīng)。在 Node 中調(diào)用是通過一系列回調(diào)完成的。
在開發(fā)者看來,這一切都由一個名為 libuv 的庫處理,它提供了一種稱為事件循環(huán)的機(jī)制。
事件循環(huán)機(jī)制也許是在整個環(huán)境中最被誤解的概念
常見的誤解 誤解1:時間循環(huán)和用戶代碼跑在不同的線程當(dāng)中原因:用戶的代碼跑在主線程中,事件循環(huán)則在另外一個線程,每次執(zhí)行回調(diào),主線程將工作交給事件循環(huán)完成,然后事件循環(huán)將 ping 主線程進(jìn)行回調(diào)
真實的:只有一個線程在執(zhí)行 JS 代碼,這個線程就是事件循環(huán)運行的線程。
執(zhí)行回調(diào)(知道正在運行的node.js應(yīng)用程序中的每個用戶級代碼都是回調(diào))由事件循環(huán)完成。我們稍后會深入討論這一點。
原因:異步操作(如使用文件系統(tǒng))執(zhí)行出站 HTTP 請求或與數(shù)據(jù)庫交談始終加載到由 libuv 提供的線程池。
真實的:默認(rèn)情況下,libuv創(chuàng)建一個包含四個線程的線程池,以將異步工作分流。如今的操作系統(tǒng)已經(jīng)為許多I / O任務(wù)提供了異步接口(例如 Linux 的 aio)。只要有可能,libuv就會使用這些異步接口,避免使用線程池。這同樣適用于數(shù)據(jù)庫等第三方子系統(tǒng)。在這里,驅(qū)動程序的作者寧愿使用異步接口,而不使用線程池。簡而言之:只有在沒有其他方式時,線程池才會用于異步I / O。
誤解3:事件循環(huán)就像堆棧或者隊列一樣原因:事件循環(huán)不斷在遍歷一系列異步任務(wù),并在任務(wù)完成時執(zhí)行回調(diào)
真實的:雖然涉及到隊列式結(jié)構(gòu),但事件循環(huán)不會貫穿并處理堆棧。事件循環(huán)作為一個過程是一組階段,其中包含以循環(huán)方式處理的特定任務(wù)。
了解事件循環(huán)的生命周期要真正了解事件循環(huán),應(yīng)該清楚各個工作分別在那個階段完成了任務(wù)。下圖將會展示事件循環(huán)是如何工作的
具體請前往 => The Node.js Event Loop, Timers, and process.nextTick() | Node.js
計時器通過 setTimeout() 或 setInterval() 計劃的所有內(nèi)容都將在此處理。
IO 回調(diào)在這里所有的回調(diào)都會被處理。由于 node 中所有業(yè)務(wù)代碼都是基于回調(diào)的。(例如,對傳入http請求的回調(diào)觸發(fā)級聯(lián)回調(diào)),因此這是處理業(yè)務(wù)代碼的階段。
IO 輪詢投票處理下一次處理的新事件
立即設(shè)置運行通過 setImmediate() 注冊的所有回調(diào)
關(guān)閉執(zhí)行所有的 (‘close’) 回調(diào)
工作處理延遲此度量標(biāo)準(zhǔn)測量線程池處理異步任務(wù)需要多長時間。高工作時間處理延遲表明繁忙/耗盡的線程池。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93307.html
摘要:定時器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時器的一個重要的事情是,我們提供的延遲不代表在這個時間之后回調(diào)就會被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒有其它具有更高優(yōu)先級的定時器,將在此時間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語言本身...
本文涵蓋 面試題的引入 對事件循環(huán)面試題執(zhí)行順序的一些疑問 通過面試題對微任務(wù)、事件循環(huán)、定時器等對深入理解 結(jié)論總結(jié) 面試題 面試題如下,大家可以先試著寫一下輸出結(jié)果,然后再看我下面的詳細(xì)講解,看看會不會有什么出入,如果把整個順序弄清楚 Node.js 的執(zhí)行順序應(yīng)該就沒問題了。 async function async1(){ console.log(async1 start) ...
摘要:定時器階段這個是事件循環(huán)開始的階段,綁定到這個階段的隊列,保留著定時器的回調(diào),盡管它并沒有將回調(diào)推入隊列中,但是以最小的堆來維持計時器并且在到達(dá)規(guī)定的事件后執(zhí)行回調(diào)。 本文,將會詳細(xì)的講解 node.js 事件循環(huán)工作流程和生命周期 一些常見的誤解 在 js 引擎內(nèi)部的事件循環(huán) 最常見的誤解之一,事件循環(huán)是 Javascript 引擎(V8,spiderMonkey等)的一部分。事實上...
摘要:文件系統(tǒng)請求和相關(guān)請求都會放進(jìn)這個線程池處理其他的請求,如網(wǎng)絡(luò)平臺特性相關(guān)的請求會分發(fā)給相應(yīng)的系統(tǒng)處理單元參見設(shè)計概覽。 譯者按:在 Medium 上看到這篇文章,行文脈絡(luò)清晰,闡述簡明利落,果斷點下翻譯按鈕。第一小節(jié)背景鋪陳略啰嗦,可以略過。剛開始我給這部分留了個 blah blah blah 直接翻后面的,翻完之后回頭看,考慮完整性才把第一節(jié)給補(bǔ)上。接下來的內(nèi)容干貨滿滿,相信對 N...
摘要:譯者覺得作者的比喻很適合初學(xué)者理解,特此翻譯。進(jìn)一步說,回調(diào)觸發(fā)的順序是不能被保證的。所以我不必?fù)?dān)心代碼在同一時間訪問同一個數(shù)據(jù)結(jié)構(gòu)你確實理解了,這就是的單進(jìn)程事件循環(huán)設(shè)計美麗的地方。 前言 總括 :這篇文章十分生動形象的的介紹了Node,滿足了讀者想去了解Node的需求。作者是Node的第一批貢獻(xiàn)者之一,德國前端大神。譯者覺得作者的比喻很適合初學(xué)者理解Node,特此翻譯。 譯者 :原...
閱讀 1017·2021-10-27 14:15
閱讀 2773·2021-10-25 09:45
閱讀 1938·2021-09-02 09:45
閱讀 3363·2019-08-30 15:55
閱讀 1806·2019-08-29 16:05
閱讀 3199·2019-08-28 18:13
閱讀 3112·2019-08-26 13:58
閱讀 448·2019-08-26 12:01