2012-02-27 21 views
15

zrobić ponownych prób z selera, jak w Przykładzie-dokumentów:wydłużyć czas ponawiania seler każdy cykl ponownej próby

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

Jak można zwiększyć ponawiania-odliczanie ponawiania występuje za każdym razem do tego zadania - np 60 sekund, 2 minuty, 4 minuty itd., Aż zostanie zwiększona wartość MaxRetriesExceeded?

+1

myślę, że należy zmienić wybraną odpowiedź. – guival

Odpowiedz

28

Oto prosty sposób na uzyskanie większego opóźnienia za każdym razem, gdy zadanie jest oceniane. Ta wartość jest aktualizowana przez samego selera, więc nie musisz samodzielnie zarządzać.

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

Uwaga: Pierwsze zadanie powtarza się z odliczaniem 0. Ponieważ liczba ponownych prób wynosi 0 dla pierwszego uruchomienia.

+0

Dzięki za dodanie * dodaj .request.retries * – Kaveh

7

Przechowywać zmienną z ostatniego czasu ponawiania w nim, i pomnożyć ją przez 2, za każdym razem, aż przekroczy poziom cokolwiek chcesz (lub zachować rachubę jeśli wolisz pewną liczbę razy ...)

+0

Więc nie ma eleganckich/magicznych sposobów, aby to zrobić zamiast przekazywania ponownej licznika do metody przy każdym ponownym próbowaniu? – Gregor

+0

Nie jestem dostatecznie zaznajomiony z selerem, ale jeśli przeczytałeś instrukcję i jej nie znalazłeś, wydaje się to łatwym sposobem na osiągnięcie tego, co chcesz, z tylko dwoma lub trzema liniami kodu, co wydaje się dość łatwe. – Perry

+0

@Gregor, myślę, że to jest eleganckie, ale może moglibyśmy dodać również retry_step. Możesz utworzyć problem na stronie http://github.com/ask/issue, aby poprosić o taką funkcję. – asksol

0

Od version 4.2 można użyć opcji autoretry_for i retry_backoff dla tych celów, na przykład:

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