使用 Django-Celery 重试任务 - Django/Celery

Posted

技术标签:

【中文标题】使用 Django-Celery 重试任务 - Django/Celery【英文标题】:Retrying tasks with Django-Celery - Django/Celery 【发布时间】:2011-06-19 09:02:39 【问题描述】:

我在重试任务时遇到问题,这是测试任务的样子

from celery.decorators import task

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

我找不到任何关于如何重试装饰任务的文档,我只找到了以下内容:

self.retry(x,y, exc=exception, countdown=30)

这似乎不适用于我的情况,因为该方法没有传递 self 变量。

编辑:

我现在尝试以下方法无济于事:

from celery.decorators import task

@task()
def add(x, y):
    if not x or not y:
        try:
            raise Exception("test error")
        except Exception, e:
            add.retry([x, y], exc=e, countdown=30)
    return x+y

我收到以下错误:

TypeError("重试的kwargs参数不能为空。任务必须接受**kwargs,见http://bit.ly/cAx3Bg",)

【问题讨论】:

没有自我,因为你的任务没有绑定。这是 Celery 3.1 中的一个新概念:@task(bind=True) def add(self, x, y):。如果您使用早期版本,则必须引用任务名称:add.retry(...) 另外,你得到最后一个错误是因为你没有为任务指定关键字参数:add.retry([x, y], , exc=e, countdown=30) ought to work, but you don't have to specify x` 和 y 这里(除非函数改变了它们的值), because retry`将自动使用用于调用任务的参数:add.retry(exc=e, countdown=30) 【参考方案1】:

您可以在装饰器中设置重试参数:

@task(default_retry_delay=5 * 60, max_retries=12)
def foo(bar):
  try:
      ...
  except Exception, exc:
      raise foo.retry(exc=exc)

【讨论】:

【参考方案2】:

任务需要接受关键字参数,它们用于传递有关重试计数的信息。我认为代码应该是这样的:

from celery.decorators import task

@task()
def add(x, y, **kwargs):
    if not x or not y:
        try:
            raise Exception("test error")
        except Exception, e:
            add.retry(args=[x, y], exc=e, countdown=30, kwargs=kwargs)
    return x+y

**kwargs需要添加到add函数的签名中,并在调用重试时作为kwargs=kwargs传递。

注意:这种风格was deprecated with the release of celery 2.2。

【讨论】:

是的,在最新版本中,似乎只需执行 add.retry(exc=e, countdown=30) 就足够了 ...其中 add 被替换为任何装饰任务的名称/方法是。

以上是关于使用 Django-Celery 重试任务 - Django/Celery的主要内容,如果未能解决你的问题,请参考以下文章

Django-Celery 进度条

Django-celery 和 RabbitMQ 不执行任务

django-Celery分布式队列简单使用

如何判断任务是不是已经在 django-celery 中排队?

python3.7 中使用django-celery 完成异步任务

通过 Django-celery 调度数千个一次性(非重复性)任务以实现近乎同时执行