Python Glossary English

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Сообщить о неточности