16

具体的には(サーバー側)V8について話し、精度を検出して補正できるため、精度を気にしないと仮定すると、setTimeout を使用して、他の制限に直面することなく、互いに数秒離れた数千の比較的単純なタイムアウトを文字通り設定できますかRAM以外?いつでも何千ものスケジュールされたタイムアウトが発生する可能性があるシステムを使用する場合、注意すべき問題はありますか?

記録として、 Javascriptタイマーの仕組みに関するジョンのResigの優れた記事を読んだので、そこですでにカバーされていることを指摘する必要はありません:) node.jsはシングルスレッドであることを認識しており、タイマーは時間がかかりすぎると他のタイマーをブロックする可能性がありますなど

PS: 私が説明したことがどれほど実行可能かを厳密に理解しようとしているのです。

4

2 に答える 2

15

実際に直面する可能性のある唯一の制限は、ノードで使用できるメモリの量です。次のコードを使用してテストします。oneMillion と int32Max を使用して、以下の例を正常に実行しました。int64Max を使用すると、ノードから次のエラーが表示されました。4 GB の 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++);
}
于 2012-08-29T08:34:55.520 に答える
1

ノードがどのように動作するかはわかりませんが、MAXINT + 1タイマーを実行せずに作成すると、整数のオーバーフローのリスクがあります。

于 2012-08-28T23:02:47.190 に答える