2012-02-27 18 views
15

faccio tentativi con sedano come nel Docs-Esempio:Aumentare il tempo di sedano tentativi ogni ciclo di tentativi

@task() 
def add(x, y): 
    try: 
     ... 
    except Exception, exc: 
     add.retry(exc=exc, countdown=60) # override the default and 
              # retry in 1 minute 

Come è possibile aumentare il retry-conto alla rovescia ogni volta che il nuovo tentativo si verifica per questo lavoro - per esempio 60 secondi, 2 minuti, 4 minuti e così via fino a quando viene raggiunto MaxRetriesExceeded?

+1

Credo che si dovrebbe cambiare la risposta selezionata. – guival

risposta

28

Ecco un modo semplice per creare un ritardo maggiore ogni volta che viene valutata l'attività. Questo valore viene aggiornato da Celery stesso, quindi non è necessario gestire nulla da soli.

@task() 
def add(x, y): 
    try: 
     ... 
    except Exception as exc: 
     raise add.retry(exc=exc, countdown=60 * add.request.retries) 

Nota: il primo compito viene ripetuto con il conto alla rovescia di 0. Poiché il numero di tentativi è 0 per la prima esecuzione.

+0

Grazie per aver menzionato * aggiungi .request.retries * – Kaveh

7

Mantenere una variabile con il vostro ultimo numero di tentativi in ​​esso, e moltiplicarlo per 2 ogni volta fino a superare qualsiasi livello che volete (o, tenere un conteggio, se si preferisce un certo numero di volte ...)

+0

Quindi non esiste un modo elegante/magico per fare questo invece di passare un contatore di tentativi al metodo su ogni nuovo tentativo? – Gregor

+0

Non ho abbastanza familiarità con il sedano, ma se hai letto il manuale e non l'hai trovato, questo sembra un modo semplice per realizzare ciò che vuoi con solo due o tre linee di codice, il che sembra abbastanza facile. – Perry

+0

@Gregor, penso che sia elegante, ma forse potremmo aggiungere anche retry_step. È possibile creare un problema su http://github.com/ask/issue per richiedere tale funzionalità. – asksol

0

Dal version 4.2 è possibile utilizzare le opzioni autoretry_for e retry_backoff per questo scopo, per esempio:

@task(max_retries=10, autoretry_for=(Exception,), retry_backoff=60) 
def add(x, y): 
    pass 
Problemi correlati