Python Glossary English

Python 3.4+Асинхронное программированиефункция

asyncio.shield()

задачи

Защищает awaitable от отмены: если отменят того, кто ждёт, внутренняя задача продолжит работу до конца.

Синтаксис

result = await asyncio.shield(aw)

Отмена всё равно доходит до вызывающего: await shield(...) бросает CancelledError (или wait_for — TimeoutError), просто внутренняя задача её не получает. Если передать корутину, shield сам создаст задачу, и ссылки на неё у вас не будет — цикл держит задачи слабыми ссылками, и её может собрать сборщик мусора. Поэтому задачу создают заранее, хранят и позже дожидаются.

Примеры

# Python 3.11+
import asyncio
async def save():
    await asyncio.sleep(0.03)
    print('сохранено')
async def main():
    task = asyncio.create_task(save())
    try:
        await asyncio.wait_for(asyncio.shield(task), timeout=0.01)
    except TimeoutError:
        print('тайм-аут, но запись идёт')
    await task  # держим ссылку и дожидаемся
asyncio.run(main())  # → тайм-аут, но запись идёт / сохранено

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности