」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Node.js 中的事件循環如何運作?

Node.js 中的事件循環如何運作?

發佈於2024-08-24
瀏覽:773

How event loop work in Node.js?

事件循環是 Node.js 中的一個核心概念,它使其能夠有效地處理非同步操作。以下是其運作方式的簡化說明:

1. 單線程性質

Node.js 在單執行緒上運行。這意味著它一次只能執行一段程式碼。然而,Node.js 被設計為可以同時處理許多操作,而不需要多個執行緒。

2. 非阻塞I/O

Node.js 使用非阻塞 I/O 操作。當 Node.js 執行讀取檔案、查詢資料庫或發出網路請求等任務時,它不會等待這些任務完成就繼續執行下一個任務。相反,它在處理這些任務時繼續執行其他程式碼。

3. 事件循環機制

事件循環負責管理程式碼的執行和處理非同步事件。它不斷檢查任務“隊列”並決定執行哪些任務。這是一步一步的細分:

  • 初始化:當 Node.js 應用程式啟動時,它會初始化並設定環境。
  • 執行階段:Node.js 同步執行任何初始程式碼。如果存在非同步任務(例如檔案讀取或 HTTP 請求),它們將被移交給系統的 API。
  • 事件循環階段:事件循環有幾個階段,它按特定順序處理每個階段中的任務:
    • 定時器階段:執行由setTimeout()和setInterval()安排的回呼。
    • IO Callbacks Phase:執行I/O操作的回調,例如檔案讀取或網路請求。
    • 空閒,準備階段:用於系統任務的內部階段。
    • Poll Phase:檢索新的 I/O 事件,執行它們的回呼。如果poll佇列為空,則會檢查setImmediate()佇列中是否有回呼。
    • 檢查階段:執行setImmediate()安排的回調。
    • 關閉回呼階段:處理關閉事件,例如由socket.on('close').
    • 發出的事件
  • 重新檢查並退出:如果事件循環沒有更多任務要處理,它將退出,讓程式終止。如果還有待處理的任務,它將繼續運作。

4. 回呼隊列

非同步任務完成後,將其回調推送到佇列。事件循環從佇列中選取這些回調並按順序執行它們。

5.微任務隊列(下一個Tick)

除了主佇列之外,還有一個微任務佇列(或下一個滴答佇列),其中使用 process.nextTick() 或 Promise 的 .then() 處理程序調度的回呼排隊。微任務優先於常規回調,這意味著它們在當前操作完成之後、事件循環進入下一階段之前執行。

例子

以下是一個簡單的例子來說明事件循環是如何運作的:

const fs = require('fs');

console.log('Start');

fs.readFile('file.txt', (err, data) => {
  if (err) throw err;
  console.log('File read complete');
});

console.log('End');

輸出:

Start
End
File read complete

解釋:

  1. console.log('開始');和 console.log('結束');同步執行。
  2. fs.readFile 啟動非同步檔案讀取操作,不等待繼續執行下一行程式碼。
  3. 一旦檔案讀取操作完成,其回呼(console.log('檔案讀取完成');)就會被推送到事件循環的回呼佇列中。
  4. 事件循環在同步程式碼執行完成後處理回呼。

儘管 Node.js 是單線程的,但事件循環允許 Node.js 透過將操作委託給系統並非同步處理其結果來有效地一次處理多個操作。

事件循環編排任務的執行,優先考慮微任務隊列,以確保在繼續執行主任務隊列中的任務之前快速解決承諾和相關操作(宏任務)。

這種動態使 JavaScript 能夠在單線程環境中處理複雜的異步行為。

版本聲明 本文轉載於:https://dev.to/syed_ammar/how-event-loop-work-in-nodejs-4lf4?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3