Найти - Пользователи
Полная версия: Понимание асинхронного контекстного менеджера python
Начало » Python для новичков » Понимание асинхронного контекстного менеджера python
1
NiKiTa333
Всем привет! Подскажите, пожалуйста, зачем контекстный менеджер асинхронный?
Ведь он не добавлен в задачи.

 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())
xam1816
NiKiTa333
зачем контекстный менеджер асинхронный?
почему появился такой вопрос? В асинхронном коде функции и методы должны быть асинхронные, чтобы не блокировать друг друга
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB