该task.request.retries
属性包含到目前为止的尝试次数,因此您可以使用它来实现指数补偿:
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)
import random
self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))