2012-08-28 73 views
11

具體談論(服務器端)V8,並假設我不關心準確性,因爲我可以檢測並補償它,我可以字面上設置成千上萬個相對簡單的超時使用setTimeout彼此相隔幾秒面臨RAM以外的任何其他限制?如果我使用的系統在任何特定時間可能有成千上萬的計劃超時,那麼我是否應該注意到這一點?setTimeout有任何限制嗎?

爲了記錄我已閱讀John's Resig關於How Javascript Timers work的優秀文章,所以不需要指出任何已經涵蓋的東西:)我知道node.js是單線程的,定時器可以阻止其他定時器長等

PS:我嚴格試圖理解我描述的是多麼可行,沒有必要指出「當然有更好的方法來做你打算做的事情!」。

+5

還有的保證更好的方法,你打算怎麼辦! – jAndy

+2

設置幾百萬次超時只是一個「for」循環。嘗試一下,然後告訴我們。 ;) – Jon

+0

@Jon我試過這個,因爲我也想知道,我相信它不是那麼貴...... – Alfred

回答

11

您遇到的唯一真實世界限制是可用於節點的內存量。使用下面的代碼來測試。我使用oneMillion和int32Max成功運行了下面的示例。當使用int64Max時,我從節點收到以下錯誤。我正在使用帶有4GB RAM的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++); 
} 
+0

Javascript數字有53位尾數,所以一旦它達到2^53左右,增量不再起作用,它會輪迴關閉到相同的數字而不會造成任何改變。對此感到懷疑?在調試器控制檯中嘗試'Math.pow(2,53)'和'Math.pow(2,53)+ 1'。爲什麼提到'int64Max'? – doug65536

1

我不知道節點是如何操作的,但是如果你創建了MAXINT + 1定時器而不讓它們運行,你可能會冒一個整數溢出的風險。