【问题标题】:Is there any limit to setTimeout?setTimeout 有限制吗?
【发布时间】:2012-08-23 12:26:59
【问题描述】:

具体谈谈(服务器端)V8,假设我不关心准确性,因为我可以检测和补偿它,我是否可以字面上设置数千个相对简单的超时间隔几秒钟彼此使用 setTimeout 而不面临除 RAM 之外的任何其他限制?如果我要使用在任何给定时间可能有数千个预定超时的系统,我应该注意什么?

作为记录,我已经阅读了 John 在 How Javascript Timers work 上的 Resig 优秀文章,因此无需指出那里已经涵盖的任何内容 :) 我知道 node.js 是单线程的,如果计时器占用,计时器可以阻止其他计时器太长了等等。

PS:我严格地试图理解我所描述的可行性,无需指出“肯定有更好的方法来做你想做的事!”。

【问题讨论】:

  • 保证有更好的方法来做你想做的事!
  • 设置几百万个超时只是一个for 循环。试试看,然后告诉我们。 ;)
  • @Jon 我试过这个是因为我也想知道而且我相信它并没有那么贵......

标签: javascript node.js v8


【解决方案1】:

您可能遇到的唯一现实世界限制是节点可用的内存量。使用以下代码进行测试。我使用 oneMillion 和 int32Max 成功运行了下面的示例。使用 int64Max 时,我从 node.js 收到以下错误。我正在使用 64 位 Windows 和 4GB 内存。

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

要测试的节点代码:

var util = require('util');
var int64Max = 9007199254740992; 
var int32Max = 2147483647;
var oneMillion = 1000000;
var tenThousand = 10000;
var counter = 0;

//Exchange the limiter with one of the above vars to test.
for (var i = 0; i < oneMillion; i++){   
     setTimeout(log, 1);
     //Required as the timeout/callback method will not be called until the loop ends due 
     //to node/js being single threaded.
     util.log('loop:' + i);
}

function log(){
     util.log('callback: ' + counter++);
}

【讨论】:

  • Javascript 数字有 53 位尾数,所以一旦达到 2^53 左右,增量就不再起作用,它会四舍五入到相同的数字而不会造成任何变化。对此感到怀疑?在调试器控制台中尝试Math.pow(2,53)Math.pow(2,53)+1。为什么会提到int64Max
  • 我没有process out of memory,但是当我做一个高于2147483647的超时时,回调函数是直接启动的!我在一个 docker 容器 btw 中运行它
【解决方案2】:

我不知道节点是如何运行的,但是如果你创建 MAXINT+1 个定时器而不让它们运行,你就有整数溢出的风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2021-07-17
    • 2016-01-11
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    相关资源
    最近更新 更多