簡體   English   中英

當setTimeout <5 node.js時會發生什么

[英]What happens when setTimeout < 5 node.js

目的

當X-> 0時找出setTimeout(fn, X)的真實行為。

背景

我正在開發使用setTimeout()進行QPS(每秒查詢)測試的工具。 最近,當我對1000 QPS進行測試時感到很驚訝,該測試大約需要5秒鍾才能執行,而應該花1秒鍾(不計算任何其他外部因素)。

對於較低的QPS值(例如,波紋管100),該測試工作正常。

在調查過程中,我發現一些文章解釋說,在進行setTimeout(fn, X)調用時,當X趨於0時,如果X太小,它將被修整到更高的值。

從2011年的這個問題中可以看到一個示例,其中舊規范指定如果setTimeout(fn, X)其中X <= 3,則X將自動設置為4。

這意味着在兩次執行setTimeout()之間,我可以等待的最短時間為4毫秒。 如果我有setTimeout(fn, 1) ,它將被轉換為setTimeout(fn, 4)

問題

我看到的每篇文章都有不同的說法,在我先前發布的問題中,不同的答案也有不同的說法。 總體而言,所有結論似乎都是“ 沒有結論,因為行為高度不一致 ”。

回到node.js,由於我指出的問題已經很老了,所以我想對以下內容進行更新:

  1. 答案之一是X的最小值是1。這仍然准確嗎?
  2. 當X-> 0時setTimeout(fn, X)如何工作?

結論

我想要有關setTimeout()更多信息,因此可以圍繞它構建我的代碼。 鏈接到文檔和文章日期或找到答案的鏈接將受到高度贊賞。


謝謝您的幫助!

它與事件循環有關。 想象一堆命令,node.js依次執行。

setTimeout是(簡化版本)“將其放在堆的最后,不要在X毫秒之前執行”。

因此,盡管可以確定至少要等待那個時間,但是仍然需要等待node.js才能使該任務回到堆的頂部,這可能需要一些時間(毫秒級)。

這就是為什么建議使用process.nextTick ,它將任務放在堆的頂部,而不是setTimeout(callback, 0)

因此,在您的示例中, setTimeout(callback, 1)不會在內部轉換為setTimeout(callback, 4) ,只是一旦計時器過去,node.js在返回該任務之前會有3ms的開銷。 如果事件循環中沒有其他內容,並且您的處理器運行速度很快,那么您也許可以再減少一毫秒,但是node.js並未構建為在該級別處理對時間敏感的任務。 這將使它進入實時編程領域,這是完全另一種用途。

setTimeout ,在大多數用例中, setTimeout只能處理幾秒鍾,因此大約1000ms。 2〜3ms真的給您帶來不便嗎?

process.nextTick還將允許node.js清除事件隊列,並防止RangeError: Maximum call stack size exceeded當您鏈接許多異步調用時, RangeError: Maximum call stack size exceeded異常。

暫無
暫無

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

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