首页 > 解决方案 > Celery 只重试循环中的失败请求并继续另一个

问题描述

我对 celery 整体有点陌生,并且在 for 循环中遇到了重试案例的问题:

我有以下任务:

@app.task(bind=True, autoretry_for=(CustomException,), retry_kwargs={'max_retries': 10,'countdown': 30})
def call_to_apis(self):
   api_list = [api1, api2, api3, api4, api5,...]
   for api in api_list:
       try:
           response = requests.get(api)
           if response.status_code == 500:
              raise CustomException
       except CustomException:
           continue

据我了解,芹菜将重试我的CustomException成长。

在重试的情况下,是只重试失败的api还是重新运行api_list中每个api的整个过程?如果是这样,它是否只能重试失败的api?

预期结果:仅重试失败的 api

编辑:

我已将其拆分为 2 个不同的任务和 1 个请求功能,如下所示:

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(300.0, call_to_apis.s())
    print("setup_periodic_tasks")

def call_api(api):
    response = requests.get(api)
    if response.status_code == 500:
        raise CustomException
    elif response.status_code == 404:
        raise CustomWrongLinkException


@app.task(default_retry_delay=30, max_retries=10)
def send_fail_api(api):
    try:
        call_api(api)
    except NonceTooLowException:
        try:
            send_fail_api.retry()
        except MaxRetriesExceededError:
            print("reached max retry number")
            pass
    except Exception:
        pass


@app.task()
def call_to_apis():
   api_list = [api1, api2, api3, api4, api5,...]
   for api in api_list:
       try:
          call_api(api)
       except CustomException:
          send_fail_api.delay(api)
       except CustomWrongLinkException:
          print("wrong link")
       except Exception:
          pass

它工作并且其他 api 完成,失败的 api 它应该调用另一个任务并重试 10 次,每次延迟 30 秒。

但是我重试了大约 24 次(预计只重试 10 次)并且它也在reached max retry number第 10 次重试时打印出来但它仍然重试到 24 次重试

我究竟做错了什么 ?

标签: python-3.xcelerycelerybeat

解决方案


如果出现已知异常(在autoretry_for装饰器参数中指定),将重试整个任务,请参阅文档。当引发异常时,Celery 无论如何都无法知道任务的状态,这就是您必须处理的。我建议将任务拆分为单个任务(每个 API 一个)并分别调用它们,大概是创建一些工作流


推荐阅读