Назад к вопросам
Middle+
434
questionbank

Чем асинхронный контекстный менеджер отличается от синхронного?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Асинхронный контекстный менеджер используется в асинхронных функциях (async def) и позволяет управлять асинхронными ресурсами. Он предоставляет методы __aenter__ и __aexit__, которые являются сопрограммами и могут использовать await.

Синхронный контекстный менеджер используется в обычных функциях (def) и управляет синхронными ресурсами. Он предоставляет методы __enter__ и __exit__, которые являются обычными функциями и не могут использовать await.

Основное отличие — возможность выполнения асинхронных операций (await) в методах __aenter__ и __aexit__, что недоступно в синхронных __enter__ и __exit__.

Пример синхронного:

// Пример синхронного контекстного менеджера
class SyncResource:
    def __enter__(self):
        print("Синхронный ресурс открыт")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Синхронный ресурс закрыт")

// Использование синхронного
with SyncResource():
    print("Работа с синхронным ресурсом")

Пример асинхронного:

// Пример асинхронного контекстного менеджера
import asyncio

class AsyncResource:
    async def __aenter__(self):
        print("Асинхронный ресурс открыт")
        await asyncio.sleep(0.1) // Асинхронная операция
        return self

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        print("Асинхронный ресурс закрыт")
        await asyncio.sleep(0.1) // Асинхронная операция

// Использование асинхронного в асинхронной функции
async def use_async_resource():
    async with AsyncResource():
        print("Работа с асинхронным ресурсом")

// Запуск асинхронной функции
asyncio.run(use_async_resource())