2012-08-28 30 views
11

Hablando específicamente sobre (lado del servidor) V8, y suponiendo que no estoy preocupado acerca de la precisión porque puedo detectarlo y compensarlo, ¿podría literalmente configurar miles de tiempos de espera relativamente simples con segundos de diferencia usando setTimeout sin enfrentando cualquier otro límite que no sea RAM? ¿Hay alguna trampa que deba tener en cuenta si utilizo un sistema en el que puede haber miles de tiempos de espera programados en un momento dado?¿Hay algún límite para setTimeout?

Para el registro que he leído excelente artículo de John Resig en How Javascript Timers work así que no hay necesidad de señalar algo que ya está cubierto allí :) Soy consciente de que node.js es de un solo hilo, los temporizadores pueden bloquear otros temporizadores si toman también largo, etc.

PD: Estoy tratando estrictamente de entender qué tan viable es lo que describo, no es necesario señalar que "seguramente hay una mejor manera de hacer lo que pretende hacer".

+5

no está garantizado una mejor manera de hacer lo que quieres hacer! – jAndy

+2

La configuración de unos pocos millones de tiempos de espera es solo un "para" bucle de distancia. Pruébalo y cuéntanos en su lugar. ;) – Jon

+0

@ Jon He intentado esto porque yo también estaba preguntando y yo creo que no era tan caro ... – Alfred

Respuesta

11

El único mundo real límite que puedan surgir en contra es la cantidad de memoria disponible para el nodo. Usa el siguiente código para probar. Ejecuté con éxito el ejemplo a continuación usando oneMillion e int32Max. Cuando uso int64Max, recibí el siguiente error del nodo. Estoy usando ventanas de 64 bits con 4 gb de RAM. código

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 

nodo a prueba:

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

números Javascript tienen 53 bits de mantisa, por lo que una vez que alcanza alrededor de 2^53, el incremento ya no funciona, se redondea apagado al mismo número sin causar ningún cambio. ¿Dudo? Pruebe 'Math.pow (2,53)' y 'Math.pow (2,53) + 1' en una consola de depuración. ¿Por qué se menciona 'int64Max' en absoluto? – doug65536

1

No sé cómo funciona nodo, pero si crea MAXINT + 1 temporizadores sin dejarlos correr, corre el riesgo de un desbordamiento de enteros.