Сообщить об ошибке.

Функция wait_for() модуля asyncio в Python

Установка тайм-аута для отмены задачи

Синтаксис:

import asyncio

asyncio.wait_for(aw, timeout, *, loop=None)

Параметры:

  • aw - awaitable - объект ожидания,
  • timeout - время, которое нужно ждать, после которого происходит отмена задачи,
  • loop=None - параметры цикла (удален с версии Python 3.10).

Описание:

Функция wait_for() модуля asyncio ждет, пока awaitable объект aw завершится с таймаутом timeout.

Если aw является сопрограммой, то она автоматически назначается как задача.

Аргумент timeout может иметь: значение None, число float или int, выраженное в секундах, в течение которых будет приостановлена задача. Если таймаут равен None, то происходит блокировка до завершения Future.

Если истекает тайм-аут, то функция asyncio.wait_for() отменяет задачу и вызывает ошибку asyncio.TimeoutError.

Если необходимо избежать отмены задачи, то оберните ее в функцию asyncio.shield().

Функция asyncio.wait_for() будет ждать до тех пор, пока объект Future не будет фактически отменен, поэтому общее время ожидания может превысить таймаут. Если во время отмены происходит исключение, то оно распространяется на вызывающую сторону.

Если ожидание результата отменяется, то результат выполнения aw также отменяется.

Изменено в Python 3.10: Аргумент loop удален.

В Python 3.11 добавлен асинхронный контекстный менеджер asyncio.timeout() для установки тайм-аута для асинхронных операций. Для нового кода рекомендуется использовать asyncio.timeout() вместо asyncio.wait_for().

Примеры использования asyncio.wait_for():

async def eternity():
    # Засыпаем на 1 час
    await asyncio.sleep(3600)
    print('Ура!')

async def main():
    # ждем не более 1 сек.
    try:
        await asyncio.wait_for(eternity(), timeout=1.0)
    except asyncio.TimeoutError:
        print('timeout!')

asyncio.run(main())

# timeout!