gpt4 book ai didi

django - 从超过 max_retries 失败的任务中恢复

转载 作者:行者123 更新时间:2023-12-02 09:00:08 25 4
gpt4 key购买 nike

我正在尝试异步使用 Web 服务,因为它最多需要 45 秒才能返回。不幸的是,这个 Web 服务也有些不可靠,可能会引发错误。我已经设置了 django-celery 并执行了我的任务,它可以正常工作,直到任务失败超过 max_retries 为止。

这是我到目前为止所拥有的:

@task(default_retry_delay=5, max_retries=10)
def request(xml):
try:
server = Client('https://www.whatever.net/RealTimeService.asmx?wsdl')
xml = server.service.RunRealTimeXML(
username=settings.WS_USERNAME,
password=settings.WS_PASSWORD,
xml=xml
)
except Exception, e:
result = Result(celery_id=request.request.id, details=e.reason, status="i")
result.save()
try:
return request.retry(exc=e)
except MaxRetriesExceededError, e:
result = Result(celery_id=request.request.id, details="Max Retries Exceeded", status="f")
result.save()
raise
result = Result(celery_id=request.request.id, details=xml, status="s")
result.save()
return result

不幸的是,MaxRetriesExceededError没有被retry()抛出,所以我不知道如何处理这个任务的失败。 Django 已经将 HTML 返回给客户端,并且我正在通过 AJAX 检查 Result 的内容,这永远不会达到完全失败 f 状态。

所以问题是:当 Celery 任务超过 max_retries 时,如何更新数据库?

最佳答案

问题是 celery 在达到重试限制时尝试重新引发您传入的异常。执行此重新加注的代码如下: https://github.com/celery/celery/blob/v3.1.20/celery/app/task.py#L673-L681

解决这个问题的最简单方法是根本不让 celery 管理您的异常:

@task(max_retries=10)
def mytask():
try:
do_the_thing()
except Exception as e:
try:
mytask.retry()
except MaxRetriesExceededError:
do_something_to_handle_the_error()
logger.exception(e)

关于django - 从超过 max_retries 失败的任务中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6499952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com