在运行时更改celery任务的default_retry_delay?

时间:2016-11-28 10:00:10

标签: python celery

有没有办法在运行时修改celery任务的重试延迟?或者是否存在可以更改为覆盖180s默认值的全局配置值?

我已经设置了指数退避的任务(如此处所述:Retry Celery tasks with exponential back off)但我希望在集成测试时覆盖此值。

原因是如果在异常处理程序中引发异常,我常常会触发180s默认值,这似乎绕过并忽略倒计时参数。

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中重试任务,这使得使用合理的超时运行集成测试变得非常困难

1 个答案:

答案 0 :(得分:0)

参考文件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)