setTimeout <5 node.js时会发生什么
目的
当X> 0时setTimeout(fn, X)
找出setTimeout(fn, X)
的真实行为。
背景
我正在开发一个使用setTimeout()
进行QPS(每秒查询)testing的工具。 我最近感到惊讶,当我做了1000个QPS的testing,花了大约5秒钟执行,当它应该采取1(不包括任何其他外部因素)。
例如,对于较低的QPS值,testing工作正常。
在调查的时候,我发现一些文章解释说,当setTimeout(fn, X)
调用时,当X趋向于0时,如果X太小,它会被修剪到更高的值。
这个例子可以从2011年的这个问题中看到,旧规范指定如果setTimeout(fn, X)
其中X <= 3),X将被自动设置为4。
- setTimeout(fn,0)和setTimeout(fn,1)之间的区别?
这意味着两次执行setTimeout()
之间我希望等待的最less时间是4毫秒。 如果我有setTimeout(fn, 1)
,它将被转换为setTimeout(fn, 4)
。
问题
我看到的每一篇文章都说了一些不同的东西,在我之前发布的问题中,不同的答案也是不同的。 总的来说,所有的结论似乎都是“ 没有结论,因为行为是非常不一致的 ”。
回到node.js,既然我指出的问题是相当古老的,我想要更新以下内容:
- 其中一个答案是X的最小值是1.这是否准确?
- 当X – > 0工作时
setTimeout(fn, X)
如何?
结论
我想了解更多有关setTimeout()
信息,所以我可以在其周围构build我的代码。 链接到文件和文章的date或find答案将不胜感激。
谢谢您的帮助!
它与事件循环有关。 想象一堆顺序,那个node.js一个接一个地执行。
setTimeout
是(虚弱版本)“把它放在堆栈的最后,不要在Xmilliseconds之前执行”。
所以,当你确定至less要等待那个时候,你仍然需要等待node.js把这个任务返回到堆栈顶部,这可能需要一些时间(以毫秒为单位)。
这也是为什么build议使用process.nextTick
,它将任务置于堆栈顶部,而不是setTimeout(callback, 0)
。
所以在你的例子中, setTimeout(callback, 1)
不会被内部转换为setTimeout(callback, 4)
,只是在timer.js返回到这个任务之前有一个3ms的开销。 如果事件循环中没有别的东西,而且处理器速度很快,那么可能会缩短另一个毫秒,但是node.js并不是用来处理该级别的时间敏感任务的。 这将把它放在实时编程领域,这是另一个用途。
为了说明问题, setTimeout
在大多数用例中被用于处理几秒钟,所以〜1000ms。 2〜3ms是否真的有这么多的不便?
process.nextTick
也将允许node.js清理事件队列,并且在链接大量asynchronous调用时防止RangeError: Maximum call stack size exceeded
exception。