Вопрос проверяет понимание различий между синхронными и асинхронными контекстными менеджерами в Python.
Синхронные контекстные менеджеры реализуются через методы __enter__ и __exit__, которые выполняются синхронно. Асинхронные контекстные менеджеры используют __aenter__ и __aexit__, которые являются корутинами (async def) и требуют использования await.
class FileManager:
def __enter__(self):
print("Открытие файла")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Закрытие файла")
with FileManager():
print("Работа с файлом")class AsyncFileManager:
async def __aenter__(self):
print("Асинхронное открытие файла")
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
print("Асинхронное закрытие файла")
async def main():
async with AsyncFileManager():
print("Работа с файлом")Асинхронные контекстные менеджеры используются в асинхронном программировании для управления ресурсами, такими как соединения с базами данных, сетевые сокеты или файлы, когда операции ввода-вывода могут блокировать выполнение. Например, библиотека aiofiles предоставляет асинхронные контекстные менеджеры для работы с файлами.
Используйте синхронные контекстные менеджеры для обычного кода, а асинхронные — когда работаете с asyncio или другими асинхронными фреймворками, чтобы избежать блокировки event loop.