Python 3.11+Асинхронное программированиефункция
asyncio.timeout()
тайм-ауты
Асинхронный контекстный менеджер с тайм-аутом на весь блок: если блок не успел за delay секунд, он прерывается и наружу выходит TimeoutError.
Синтаксис
async with asyncio.timeout(delay) as cm: ...
Внутри блока по тайм-ауту летит CancelledError, и лишь на выходе из async with менеджер превращает её в TimeoutError — ловить его надо снаружи блока, а не внутри. Срок можно сдвинуть на ходу: cm.reschedule(); timeout(None) означает «без срока, назначим позже». Подавлять CancelledError внутри блока нельзя — тайм-аут тогда не сработает. Появилась в 3.11; до неё был только wait_for. Менеджер — объект asyncio.Timeout; его конструктор Timeout(when) принимает абсолютное время цикла (loop.time()), а не задержку: Timeout(5) — момент, который давно прошёл.
Примеры
import asyncio
async def main():
try:
async with asyncio.timeout(0.01) as cm:
await asyncio.sleep(0.01)
await asyncio.sleep(1)
except TimeoutError:
print('блок не уложился', cm.expired()) # → блок не уложился True
asyncio.run(main())
import asyncio
async def main():
async with asyncio.timeout(None) as cm:
cm.reschedule(asyncio.get_running_loop().time() + 1)
await asyncio.sleep(0.01)
print(cm.expired()) # → False
asyncio.run(main())
import asyncio
async def main():
loop = asyncio.get_running_loop()
async with asyncio.Timeout(loop.time() + 1) as cm: # абсолютное время цикла
await asyncio.sleep(0.01)
print(cm.expired()) # → False
asyncio.run(main())
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности