Django Celery retry()任务,但继续执行当前任务



我遇到一种情况,我收到来自第三方服务的响应,指示我的初始请求失败,应该重试。我正在调用Celery任务中的服务。重试调用没有在异常中捕获,而且它似乎没有将任务的新实例提供给代理并继续当前任务,而是将任务提供给代理然后退出任务。有什么方法可以设置重试并继续执行当前任务吗?

task.retry引发RetryTaskError异常,用于检测任务是否重试。请参阅此处的注释:http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying-一项任务-某些东西-失败

您可以使用throw=False:跳过此行为

task.retry(throw=False)
# do something else
raise RetryTaskError(None, None)

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

这有道理吗?

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

在我的情况下,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

相关内容

  • 没有找到相关文章

最新更新