2012-08-28 16 views
11

Specificamente parlando di V8 (lato server) e supponendo che non mi preoccupi dell'accuratezza perché posso rilevare e compensare, potrei letteralmente impostare migliaia di timeout relativamente semplici a diversi secondi di distanza l'uno dall'altro utilizzando setTimeout senza di fronte a qualsiasi altro limite diverso dalla RAM? C'è qualche presa di cui dovrei essere a conoscenza se dovessi usare un sistema in cui potrebbero esserci migliaia di timeout programmati in un dato momento?Esiste un limite per setTimeout?

Per la cronaca ho letto l'eccellente articolo di John's Resig su How Javascript Timers work quindi non c'è bisogno di indicare nulla che è già coperto lì :) Sono consapevole che node.js è single threaded, i timer possono bloccare altri timer se anche loro prendono long, ecc.

PS: Sto cercando di capire quanto sia praticabile ciò che descrivo, non c'è bisogno di sottolineare "c'è sicuramente un modo migliore per fare ciò che si intende fare!".

+5

c'è garantito un modo migliore per fare ciò che si intende fare! – jAndy

+2

L'impostazione di alcuni milioni di timeout è solo un "for' loop away". Provalo e dicci invece. ;) – Jon

+0

@Jon Ho provato questo perché mi stavo anche chiedendo e credo che non fosse così costoso ... – Alfred

risposta

11

L'unico limite del mondo reale che si può incontrare è la quantità di memoria disponibile per il nodo. Utilizzare il seguente codice per testare. Ho eseguito correttamente l'esempio seguente utilizzando oneMillion e int32Max. Quando si utilizza int64Max, ho ricevuto il seguente errore dal nodo. Sto usando finestre a 64 bit con 4 GB di RAM. Codice

FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 

nodo alla prova:

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

I numeri Javascript hanno 53 bit di mantissa, quindi una volta che raggiunge circa 2^53, l'incremento non funziona più, si arrotonda via allo stesso numero senza causare alcun cambiamento. Ne dubito? Prova 'Math.pow (2,53)' e 'Math.pow (2,53) + 1' in una console del debugger. Perché "int64Max" è menzionato? – doug65536

1

Non so come funziona il nodo, ma se si creano i timer MAXINT + 1 senza lasciarli funzionare, si rischia un overflow di numeri interi.

Problemi correlati