setTimeout 有限制吗?

问题描述 投票:0回答:3

具体谈论(服务器端)V8,并假设我不关心准确性,因为我可以检测并补偿它,我可以字面上使用setTimeout设置数千个相对简单的超时,彼此相隔几秒,而不需要面对除了内存还有其他限制吗?如果我要使用一个在任何给定时间可能有数千个计划超时的系统,是否有任何我应该注意的问题?

为了记录,我已经阅读了 John 的 Resig 的优秀文章 Javascript 计时器如何工作,所以无需指出那里已经涵盖的任何内容 :) 我知道 Node.js 是单线程的,计时器可以阻止其他计时器(如果它们)时间太长等等

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

javascript node.js v8
3个回答
15
投票

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

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

2
投票

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


0
投票

根据我自己的经验,单个

setTimeout
的最大延迟为25亿毫秒(约29天)。任何超出该延迟的事情都会立即执行代码/函数 - 就好像延迟为 0 毫秒一样。

© www.soinside.com 2019 - 2024. All rights reserved.