Сельдерей повторяет только запрос на ошибку в l oop и продолжает с другим - PullRequest
0 голосов
/ 03 марта 2020

Я в некотором роде новичок в сельдерее в целом, и у меня проблема с повторным запуском для a для l oop:

У меня есть следующая задача:

@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 в api_list? Если да, то есть ли попытка повторить только неудачный 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 повторных попыток

Что я делаю не так?

1 Ответ

0 голосов
/ 03 марта 2020

Вся задача будет повторена в случае известного исключения (указанного в autoretry_for аргумент декоратора), см. документацию . Сельдерей никоим образом не может знать состояние задачи, когда возникает исключение, это то, что вы должны решить. Я бы предложил разделить задачу на отдельные задачи (по одной на API) и вызывать их отдельно, предположительно создавая некоторый рабочий процесс .

...