22

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

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 ",)

4

2 回答 2

27

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

@task(default_retry_delay=5 * 60, max_retries=12)
def foo(bar):
  try:
      ...
  except Exception, exc:
      raise foo.retry(exc=exc)
于 2013-03-04T12:39:09.827 回答
17

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

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

注意:这种风格随着 celery 2.2 的发布而被弃用

于 2011-02-04T22:15:23.173 回答