首頁  >  文章  >  web前端  >  一文搞懂node.js中的事件循環

一文搞懂node.js中的事件循環

青灯夜游
青灯夜游轉載
2021-07-27 09:36:462138瀏覽

這篇文章跟大家介紹一下node.js中的事件循環,看看事件循環模型、事件循環各階段,並分享兩道關於事件循環的面試題,我們一起來看看吧!

一文搞懂node.js中的事件循環

事件循環模型

JavaScript引擎本身不會實作事件循環機制。瀏覽器中的事件循環由瀏覽器實現的,NodeJS中事件循環主要是由底層Libuv庫實現的。

Libuv函式庫是事件驅動的,其封裝和統一了不同平台的API實作。 NodeJS的跨平台和事件循環機制都是透過Libuv函式庫實現的。 【推薦學習:《nodejs 教學》】

一文搞懂node.js中的事件循環

#以上分四個步驟:

##1、NodeJS的V8引擎解析JavaScript程式碼,然後呼叫Node API

2、NodeAPI將任務分配給Libuv庫處理,

3、Libuv中透過事件循環機制管理這些任務的執行,處理結束後將結果傳回給V8引擎。

4、V8引擎回呼處理Libuv回傳

微任務與巨集任務

依任務種類,分割不同的任務佇列,微任務佇列和巨集任務隊列。

巨集任務:setTimeout、setInterval、setImmediate

微任務:promise.then()、promise.catch()、process.nextTick()

#事件循環各階段

    timers階段:執行所有setTimeout和setInterval的回呼
    pendding callback階段:某些系統操作的回呼。如TCP連接的錯誤
    poll階段:輪詢等待新的連結和請求等事件,執行I/O回呼。例如:檔案讀取操作
    check階段:執行setImmedidate的回呼
    close callback階段:關閉回呼執行,如socket.on( close...)

每個階段都會執行目前階段的任務佇列,然後再執行目前階段的微任務佇列,只有執行完所有微任務才會進行入下一階段。

瀏覽器中事件循環差異:

瀏覽器中沒有分成多個階段;優先順序:同步程式碼,微任務,巨集任務

瀏覽器中,巨集任務可能會有多個佇列,但是微任務只有一個,每次都會先執行完微任務再執行巨集任務

陳述總結

主要學習了,NodeJS的事件循環的模型,從V8引擎解析JS程式碼,然後呼叫NodeAPI,NodeAPI將任務分配給底層Libuv函式庫去執行,主要事件循環機制都是由Libuv函式庫完成的。

整個事件循環劃分了6個階段:timer階段,pendding callback階段、poll階段、check階段、close callback階段,執行的順序是:每個階段中的任務佇列執行完後再執行微任務,只有微任務執行完成後再執行下一個階段。瀏覽器的事件循環沒有分割階段,優先順序:同步程式碼、微任務、巨集任務。

面試題

問題1:你對NodeJS的事件循環的理解?

回答:我對事件循環的理解Node是單線程的,主線程將所有任務都放在循環隊列中,然後由底層的libuv庫從循環事件隊列中取出任務分配給不同的執行緒去處理,主執行緒同時也會進行回呼處理,整個過程形成事件循環。

與瀏覽器事件循環不同點:

1、瀏覽器沒有分割多個階段

2、瀏覽器任務優先:同步程式碼,微任務,宏任務

題2:事件佇列中的任務執行順序?

回答:NodeJS事件循環是分割多個階段,執行順序是:一個階段執行完成後,再執行微任務,然後再進行下一階段的執行。

更多程式相關知識,請造訪:

程式設計入門! !

以上是一文搞懂node.js中的事件循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除