Есть ли ограничение на setTimeout?

В частности, говоря о (стороне сервера) V8 и предполагая, что меня не интересует точность, потому что я могу ее обнаружить и компенсировать, могу ли я буквально настроить тысячи относительно простых тайм-аутов на несколько секунд друг от друга, используя setTimeout без обращения любой другой предел, отличный от ОЗУ? Есть ли какой-либо улов, о котором я должен знать, если я буду использовать систему, где могут быть тысячи запланированных тайм-аутов в любой момент времени?

Для записи я прочитал статью Джона Ресига о Как работают таймеры Javascript, поэтому не нужно указывать на то, что уже было там описано: ) Я знаю, что node.js однопоточный, таймеры могут блокировать другие таймеры, если они занимают слишком много времени и т.д.

PS: Я строго пытаюсь понять, насколько жизнеспособным является то, что я описываю, не нужно указывать "там, безусловно, лучший способ сделать то, что вы намереваетесь делать!".

Ответ 1

Единственный предел реального мира, с которым вы можете столкнуться, - это объем памяти, доступный для node. Используйте следующий код для тестирования. Я успешно выполнил приведенный ниже пример с использованием oneMillion и int32Max. При использовании int64Max я получил следующую ошибку от node. Я использую 64-битные окна с 4 ГБ ОЗУ.

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

Node для тестирования:

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

Я не знаю, как работает node, но если вы создаете MAXINT + 1 таймеры, не позволяя им запускаться, вы рискуете переполнением целых чисел.