setTimeout有限制吗?

时间:2012-08-28 22:57:08

标签: javascript node.js v8

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

为了记录,我在How Javascript Timers work上阅读了John's Resig的优秀文章,所以不需要指出那里已经涵盖的任何东西:)我知道node.js是单线程的,如果定时器可以阻止其他定时器他们花了太长时间等等。

PS:我正在严格理解我所描述的可行性,不需要指出“确实有更好的方法去做你打算做的事情!”。

2 个答案:

答案 0 :(得分:13)

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

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++);
}

答案 1 :(得分:1)

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