[英]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 運行時實際上使用了多個線程來挑選必須執行的回調。
我的直覺是什么:有兩個線程執行setTimeout
和setImmediate
回調,所以當它們都可用時,這會導致競爭條件,因此輸出將是不確定的。
這是正確的嗎 ? 還是有任何其他原因是不確定的?
本質上,會發生兩件事:
在(下一個)事件循環開始之前,node/libuv 必須執行 clock_gettime() 以從系統獲取當前時間。 此系統調用所用的時間是不確定的,因為它取決於當時的系統負載。 現在,如果 clock_gettime() 花費超過 1 毫秒,setTimer 回調將運行 (#),否則事件循環將繼續到下一階段 (##)。
參考: https : //github.com/nodejs/help/issues/392#issuecomment-305969168
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.