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