簡體   English   中英

為什么在主模塊中使用時 setTimeout(0) 和 setImmediate() 的行為未定義?

[英]Why is the behavior of setTimeout(0) and setImmediate() undefined when used in the main module?

nodejs 事件循環文檔中獲取以下代碼:

// timeout_vs_immediate.js
setTimeout(() => {
  console.log('timeout');
}, 0);

setImmediate(() => {
  console.log('immediate');
});

根據文檔:

例如,如果我們運行以下不在 I/O 周期(即主模塊)內的腳本,則兩個計時器的執行順序是不確定的,因為它受進程性能的約束。

為什么上述說法是正確的? 是不是因為 nodejs 運行時實際上使用了多個線程來挑選必須執行的回調。

我的直覺是什么:有兩個線程執行setTimeoutsetImmediate回調,所以當它們都可用時,這會導致競爭條件,因此輸出將是不確定的。

這是正確的嗎 ? 還是有任何其他原因是不確定的?

本質上,會發生兩件事:

  1. setTimer(0..) 被轉換成 setTimer(1..)
  2. 在(下一個)事件循環開始之前,node/libuv 必須執行 clock_gettime() 以從系統獲取當前時間。 此系統調用所用的時間是不確定的,因為它取決於當時的系統負載。 現在,如果 clock_gettime() 花費超過 1 毫秒,setTimer 回調將運行 (#),否則事件循環將繼續到下一階段 (##)。

    • 如果 (#), setTimeout(0,..) 回調在 setImmediate() 之前運行
    • 在 (##) 情況下,則不然。

參考: https : //github.com/nodejs/help/issues/392#issuecomment-305969168

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM