有没有办法在运行时修改芹菜任务的重试延迟?还是可以更改为覆盖180S的默认值的全局配置值?
我已经设置了具有指数向后的任务(如下所述:重试芹菜任务,带有指数返回),但我想在集成测试时覆盖此值。
原因是,如果在异常处理程序中提高异常,我通常最终会触发180年代的默认值,这似乎绕过并忽略了倒数参数。
class BaseTask(celery.Task):
def on_retry(self, exc, task_id, args, kwargs, einfo):
"""Log the exceptions at retry."""
logger.exception(exc)
logger.warning('Retry: {}.'.format(self.request))
super().on_retry(exc, task_id, args, kwargs, einfo)
def on_failure(self, exc, task_id, args, kwargs, einfo):
"""Log the exceptions on failure."""
logger.exception(exc)
logger.error('Failure: {}.'.format(self.request))
super().on_failure(exc, task_id, args, kwargs, einfo)
@property
def backoff_countdown(self):
return int(random.uniform(2, 4) ** self.request.retries)
@celery.task(bind=True, base=BaseTask)
def process(self, data):
try:
return some_task(data)
except Exception as exc:
raise self.retry(exc=exc, coundown=self.backoff_countdown)
不管我为self.backoff_countdown
设置了什么(即使只是返回1
),我最终都会在180s
中重述任务,这确实很难使用合理的超时运行集成测试。
请参阅文档http://docs.celeryproject.org/en/latest/userguide/tasks.html#using-a-custom-retry-delay,可以设置default_retry_delay或设置倒数值。
@celery.task(bind=True, default_retry_delay=30 * 60) # retry in 30 minutes.
def process(self, data):
try:
return some_task(data)
except Exception as exc:
# Retry in 5 minutes
raise self.retry(exc=exc, countdown=5 * 60)