Sobes.tech
Back to questions
Junior — Middle
79

Как различаются реализации асинхронного и синхронного контекстных менеджеров в Python?

Answer from AI

sobes.tech AI

Синхронный контекстный менеджер реализует методы __enter__ и __exit__, которые вызываются при входе и выходе из блока with. Он используется для управления ресурсами в синхронном коде.

Асинхронный контекстный менеджер реализует методы __aenter__ и __aexit__, которые возвращают awaitable объекты и используются с async with в асинхронном коде. Это позволяет корректно управлять ресурсами, которые требуют асинхронного освобождения или инициализации.

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

class SyncManager:
    def __enter__(self):
        print('Enter sync')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Exit sync')

with SyncManager():
    print('Inside sync')

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

class AsyncManager:
    async def __aenter__(self):
        print('Enter async')
        return self
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        print('Exit async')

import asyncio

async def main():
    async with AsyncManager():
        print('Inside async')

asyncio.run(main())

Ключевое различие — методы и синтаксис (with vs async with), позволяющие корректно работать с асинхронными операциями внутри менеджера.