import contextlib astack = contextlib.AsyncExitStack()
Класс AsyncExitStack()
модуля contextlib
асинхронный менеджер контекста, похожий на contextlib.ExitStack()
, который поддерживает объединение как синхронных, так и асинхронных менеджеров контекста, а также наличие сопрограмм для логики очистки.
Метод stack.close()
не реализован, вместо него следует использовать метод stack.aclose()
.
stack.enter_async_context(cm)
:Похож на ExitStack.enter_context()
, но ожидает асинхронный менеджер контекста.
Изменено в Python 3.11: вызывает TypeError
вместо AttributeError
, если аргумент cm
не является асинхронным менеджером контекста.
stack.push_async_exit(exit)
:Аналогичен stack.push(), но ожидает либо асинхронный менеджер контекста, либо функцию сопрограммы.
stack.push_async_callback(callback, *args, **kwds)
:Похоже на stack.callback(), но ожидает функцию сопрограммы.
stack.aclose()
:Аналогичен методу stack.close()
, но правильно обрабатывает ожидание await
.
Продолжая пример для contextlib.asynccontextmanager()
:
from contextlib import AsyncExitStack async with AsyncExitStack() as astack: connections = [await astack.enter_async_context(get_connection()) \ for i in range(5)] # Все открытые соединения будут автоматически закрыты # в конце асинхронного оператора with, даже если попытки # открыть соединение позже в списке вызовут исключение.