• Node.js Video Tutorials

Node.js - 事件迴圈



儘管JavaScript是單執行緒的,但Node.js透過儘可能將操作委託給系統核心來執行非同步非阻塞I/O操作,從而使用事件迴圈。大多數現代作業系統核心是多執行緒的,能夠透過在後臺執行來處理多個操作。噹噹前操作完成後,核心會通知Node.js,以便可以將相應的回撥新增到輪詢佇列中,最終執行。

Node.js啟動後(透過提供.js指令碼或在REPL模式下),事件迴圈就會初始化。下圖顯示了事件迴圈的操作順序:

Event Loop
  • Timers階段執行由setTimeout()和setInterval()排程的回撥函式。

  • Pending callbacks階段執行推遲到下一個迴圈迭代的I/O回撥函式。

  • Poll階段有兩個主要功能:(a) 計算應阻塞和輪詢I/O的時間長度;(b) 處理輪詢佇列中的事件。Node.js在此階段檢索新的I/O事件並執行與I/O相關的回撥函式。

  • Check階段在Poll階段完成後立即執行回撥函式。如果Poll階段變為空閒並且指令碼已使用setImmediate()計時器排隊,則事件迴圈繼續進入Check階段,而不是等待。libuv庫是Node.js執行時的一部分,負責提供處理非同步操作的支援。

JS Code
  • V8引擎處理JavaScript程式碼的執行,而Libuv庫利用相應作業系統的原生機制來處理非同步操作。

  • 最後,Close callbacks階段處理使用close事件註冊的回撥函式,例如socket.on(‘close’, function)。如果套接字突然關閉,則會發出close事件,否則將由process.nextTick()方法發出,以將函式的執行推遲到事件迴圈的下一個迭代。

在開始事件迴圈的下一個執行之前,Node.js會檢查它是否正在等待任何非同步I/O或計時器。如果沒有,則執行時會乾淨地關閉。

瞭解事件迴圈的工作原理對於構建可擴充套件的Node.js應用程式至關重要。事件迴圈是Node.js的一個基本部分,它透過確保主執行緒不被阻塞來實現非同步程式設計。

廣告