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