Проверка Asyncio done () на наличие исключений

#python #exception #python-asyncio #future

#python #исключение #python-asyncio #будущее

Вопрос:

Я проверяю, все ли мои фьючерсы выполнены таким образом:

     futures = []
    for i, img in enumerate(imgs):
        futures.append(
            asyncio.ensure_future(_process_img(i, img))
        )
    in_progress = True
    last_update_at = datetime.utcnow()
    while in_progress:
        in_progress = not all(f.done() for f in futures)
  

Дело в том, что если исключение произошло в будущем, оно все равно будет выполнено.
Мой вопрос — могу ли я как-то проверить наличие исключения в будущем? (Желательно, не ожидая этого)

Ответ №1:

Этот код неверен:

     while in_progress:
        in_progress = not all(f.done() for f in futures)
  

Он запускает цикл, который ничего не ожидает и, следовательно, не позволяет запускать другие задачи (или сам цикл событий). В результате ни один из фьючерсов не получит шанса на завершение и in_progress всегда будет оставаться true .

Правильный способ ожидания фьючерсов — использовать asyncio.wait() :

 # wait until all futures complete
await asyncio.wait(futures)
  

Могу ли я как-то проверить наличие исключения в будущем?

Вы можете использовать exception() метод для объекта future, чтобы проверить, вызвал ли future исключение.

Комментарии:

1. Это не полный код, так что не волнуйтесь, он работает. Но спасибо за exception() метод, я попробую его