Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 10, 2023 17:46:18

NiKiTa333
Зарегистрирован: 2023-03-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Понимание асинхронного контекстного менеджера python

Всем привет! Подскажите, пожалуйста, зачем контекстный менеджер асинхронный?
Ведь он не добавлен в задачи.

 import asyncio
# имитация  асинхронного соединения с некой периферией
async def get_conn(host, port):
    class Conn:
        async def put_data(self):
            print('Отправка данных...')
            await asyncio.sleep(3)
            print('Данные отправлены.')
        async def get_data(self):
            print('Получение данных...')
            await asyncio.sleep(3)
            print('Данные получены.')
        async def close(self):
            print('Завершение соединения...')
            await asyncio.sleep(3)
            print('Соединение завершено.')
    print('Устанавливаем соединение...')
    await asyncio.sleep(3)
    print('Соединение установлено.')
    return Conn()
class Connection:
    # этот конструктор будет выполнен в заголовке with
    def __init__(self, host, port):
        self.host = host
        self.port = port
    # этот метод будет неявно выполнен при входе в with
    async def __aenter__(self):
        self.conn = await get_conn(self.host, self.port)
        return self.conn
    # этот метод будет неявно выполнен при выходе из with
    async def __aexit__(self, exc_type, exc, tb):
        await self.conn.close()
async def main():
    async with Connection('localhost', 9001) as conn:
        print("    <  Добрался до send  >   ")
        send_task = asyncio.create_task(conn.put_data())
        print("    <  Добрался до receive  >   ")
        receive_task = asyncio.create_task(conn.get_data())
        # операции отправки и получения данных выполняем конкурентно
        await send_task
        await receive_task
asyncio.run(main())

Офлайн

#2 Июнь 10, 2023 18:00:13

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Понимание асинхронного контекстного менеджера python

NiKiTa333
зачем контекстный менеджер асинхронный?
почему появился такой вопрос? В асинхронном коде функции и методы должны быть асинхронные, чтобы не блокировать друг друга

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version