86 votes

Réessayez les tâches de céleri avec un recul exponentiel

Pour une tâche comme celle-ci :

 from celery.decorators import task

@task()
def add(x, y):
    if not x or not y:
        raise Exception("test error")
    return self.wait_until_server_responds(

s'il lève une exception et que je veux le réessayer du côté démon, comment appliquer un algorithme de recul exponentiel, c'est-à-dire après 2^2, 2^3,2^4 etc secondes ?

La nouvelle tentative est-elle également maintenue du côté du serveur, de sorte que si le travailleur est tué, le prochain travailleur qui apparaît prendra la tâche de nouvelle tentative ?

154voto

asksol Points 9574

L' task.request.retries contient le nombre d'essais jusqu'à présent, vous pouvez donc l'utiliser pour implémenter un back-off exponentiel :

 from celery.task import task

@task(bind=True, max_retries=3)
def update_status(self, auth, status):
    try:
        Twitter(auth).update_status(status)
    except Twitter.WhaleFail as exc:
        self.retry(exc=exc, countdown=2 ** self.request.retries)

Pour éviter un problème de troupeau tonitruant , vous pouvez envisager d'ajouter une gigue aléatoire à votre temporisation exponentielle :

 import random
self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X