Django Celery重试()任务但继续当前任务

时间:2012-02-01 03:38:34

标签: django celery

我遇到的情况是,我收到第三方服务的回复,表明我的初始请求失败,我应该重试。我在Celery任务中调用该服务。重试调用未在异常中捕获,似乎不是将任务的新实例提供给代理并继续当前任务,而是将任务交给代理并退出任务。有没有办法设置重试并继续当前任务?

2 个答案:

答案 0 :(得分:1)

task.retry引发RetryTaskError异常,该异常用于检测任务是否已重试。请参阅此处的说明:http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying-a-task-if-something-fails

您可以使用throw=False

跳过此行为
task.retry(throw=False)
# do something else
raise RetryTaskError(None, None)

如果不引发异常,则当前任务不会被标记为处于RETRY状态, 但是在SUCCESS / FAILURE状态下,取决于任务的其余部分是否成功。 由于重试任务将与当前任务共享相同的uuid,因此如果新任务在当前任务之前返回,则当前任务可以覆盖新任务的结果。 当然,如果你无视这个任务的结果也没关系。

这有意义吗?

答案 1 :(得分:0)

我的代码略有不同。在这种情况下,我有一个芹菜任务循环通过接收器列表来发送消息。如果任何发送调用失败,我不希望celery任务退出,而是继续其他接收器。

在我的情况下,task.retry(throw = False)不会发生这种情况。我确实看到了那个时刻没有做任何事情的任务。

@celery_app.task()
def send_msg_to_list():
    for recvr in Emailrecvr.objects.filter(query=obj):
        try:
            email_rv = recvr.send(msg)
        except SMTPException:
            # Dont exit the loop but continue with others 
            send_msg_to_list.retry(throw=False)
    # do some blah here