2014-12-12 12 views
12

In molti esempi di codice di google api ho visto questa riga di codice.Backoff esponenziale: time.sleep con random.randint (0, 1000)/1000

time.sleep((2 ** n) + (random.randint(0, 1000)/1000)) 

random.randint(0, 1000)/1000 restituiscono sempre millisecondi casuali.

Qual è l'uso di questi millisecondi casuali?

+0

In Python 2, (random.randint (0, 1000)/1000) restituirà sempre 0 (la divisione intera restituisce un intero). Inoltre, personalmente, potrei limitare il backoff esponenziale, altrimenti alcuni dei tuoi clienti potrebbero aspettare un tempo indesiderabilmente lungo. Vorrei usare: min (64, (2 ** n)) + (random.randint (0, 1000)/1000.0) – rouble

risposta

6

Il motivo è spiegato il API documentation:

Nel flusso sopra, random_number_milliseconds è un numero casuale di millisecondi minore o uguale a 1000. Questo è necessario per evitare alcuni errori di blocco in alcune implementazioni simultanee . Il valore di random_number_milliseconds deve essere ridefinito dopo ogni attesa.

Questa è una tecnica comune per "sfocare" il tempo di accesso delle API per evitare il thrash causato dal ricadere in schemi ricorrenti di acquisizione e rilascio del blocco delle risorse.

12

Avere un po 'di casualità in situazioni come questa è buono. Ad esempio, se si ha un numero elevato di client che colpiscono lo stesso server, farli utilizzare lo stesso backoff deterministico potrebbe far sì che colpiscano il server in modo perfetto, il che non è desiderabile.

+0

Questo ha più senso della risposta accettata – Rexford

Problemi correlati