python - try - Reintentar tareas de apio con retroceso exponencial
para que sirve el raise en python (2)
Para una tarea como esta:
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(
si arroja una excepción y quiero volver a intentarlo desde el lado del daemon, ¿cómo se puede aplicar un algoritmo de retroceso exponencial, es decir, después de 2^2, 2^3,2^4
etc. segundos?
Además, ¿se realiza el reintento desde el lado del servidor, de modo que si el trabajador es asesinado, el próximo trabajador que genere tomará la tarea de reintento?
A partir de Celery 4.2, puede configurar sus tareas para utilizar automáticamente un retroceso exponencial: http://docs.celeryproject.org/en/master/userguide/tasks.html#automatic-retry-for-known-exceptions
@app.task(autoretry_for=(Exception,), retry_backoff=2)
def add(x, y):
...
(Esto ya estaba en los documentos para Apio 4.1, pero en realidad no se lanzó, ver solicitud de fusión )
El atributo task.request.retries
contiene la cantidad de intentos hasta el momento, por lo que puede usar esto para implementar un retroceso exponencial:
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)
Para evitar un problema de manada que truena , puede considerar agregar un jitter aleatorio a su retroceso exponencial:
import random
self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))