Python 3.10+contextlibпонятие
contextlib.aclosing
менеджеры
Асинхронный контекстный менеджер, гарантирующий вызов aclose() у асинхронного ресурса на выходе (Python 3.10+).
Синтаксис
async with contextlib.aclosing(thing): ...
Главный случай — асинхронные генераторы с try/finally: если выйти из async for через break или исключение, финализация генератора не произойдёт сразу: цикл событий выполнит aclose() позже, отдельной задачей после сборки генератора (а не доживших — в shutdown_asyncgens()), то есть в непредсказуемый момент и вне контекста итерации. aclosing делает закрытие детерминированным ровно в точке выхода из блока. Работает только с объектами, у которых есть aclose(); для синхронного close() — обычный closing().
Примеры
# Python 3.11+
import contextlib
import asyncio
print(hasattr(contextlib.aclosing, '__call__')) # → True
print(issubclass(contextlib.aclosing, contextlib.AbstractAsyncContextManager)) # → True
cm = contextlib.aclosing('resource')
print(hasattr(cm, '__aenter__') and hasattr(cm, '__aexit__')) # → True
print(asyncio.run(cm.__aenter__())) # → resource
with contextlib.aclosing(None): pass # → TypeError
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности