Как запустить сопрограмму дважды в Python? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть функция-обертка, которая может запускать курсин несколько раз:

async def _request_wraper(self, courutine, attempts=5):
   for i in range(1, attempts):
      try:
         task_result = await asyncio.ensure_future(courutine)
         return task_result
      except SOME_ERRORS:
         do_smth()
         continue 

Может быть создан корутин из отличного асинхронного c fun c, который может принимать различное количество необходимых / ненужных аргументов , Когда у меня есть вторая итерация l oop, я получаю сообщение об ошибке -> не могу повторно использовать уже ожидаемую сопрограмму

Я попытался сделать копию Courutine, но это невозможно с методами copy и deepcopy. Какое может быть решение для запуска корутина дважды?

1 Ответ

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

Как вы уже узнали, вы не можете ждать сопрограмму много раз. Это просто не имеет смысла, сопрограммы не являются функциями.

Похоже, вы действительно пытаетесь повторить асинхронный вызов функции c с произвольными аргументами. Вы можете использовать произвольные списки аргументов (*args) и эквивалентный аргумент ключевого слова (**kwargs) для захвата всех аргументов и передачи их в функцию.

async def retry(async_function, *args, **kwargs, attempts=5):
  for i in range(attempts):
    try:
      return await async_function(*args, **kwargs)
    except Exception:
      pass  # (you should probably handle the error here instead of ignoring it)
...