Как реализовать неблокирующий клиент к вебсокет на AIOHTTP?

Привет!
Есть следующий код, реализующий клиент для подключения к websocket.
async def client_run():

    async with ClientSession().ws_connect('http://0.0.0.0:8080/ws') as ws:

        await ws.send_str('Hello!')
        async for msg in ws:
            if msg.type == WSMsgType.TEXT:
                if msg.data == 'close cmd':
                    await ws.close()
                    break
                else:
                    await aprint('Message received from server:', msg)
                    msg = await ainput('> ')
                    await ws.send_str(msg)
            elif msg.type == WSMsgType.ERROR:
                break

if __name__ == '__main__':
    print('Type "exit" to quit')
    loop = asyncio.get_event_loop()
    loop.run_until_complete(client_run())


Проблема в том, что строка msg = await ainput('> ') - блокирующая.
Как можно реализовать клиента на AIOHTTP, что бы он работал в неблокирующем режиме? Т.е. клиент отображает данные которые приходят с сервера в живом режиме (live-чат).
Есть аналогичный, но работающий как надо, код на asyncio.
import websockets
import asyncio

class WebSocketClient():

    def __init__(self):
        pass

    async def connect(self):
        self.connection = await websockets.client.connect('ws://0.0.0.0:8080/ws')
        return self.connection

    async def sendMessage(self, connection):
        while True:
            message = await ainput('> ')
            await self.connection.send(message)

    async def receiveMessage(self, connection):
        while True:
            message = await self.connection.recv()
            print('Message received from server: ' + str(message))

async def main(client, connection):
    await asyncio.gather(
        client.receiveMessage(connection),
        client.sendMessage(connection)
    )


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    client = WebSocketClient()
    connection = loop.run_until_complete(client.connect())
    loop.run_until_complete(main(client, connection))


upd #1:
Пробовал такую реализацию, но она так же блокируется.

async def run_client(ws):
    await ws.send_str('Hello!')
    async for msg in ws:
        if msg.type == WSMsgType.TEXT:
            if msg.data == 'close cmd':
                await ws.close()
                break
            else:
                await aprint('Message received from server:', msg)

async def promt(ws):
    while True:
        msg = await ainput('Your text here: ')
        await ws.send_str(msg)


async def main():
    async with ClientSession().ws_connect('http://0.0.0.0:8080/ws') as ws:
        await asyncio.gather(
            run_client(ws),
            promt(ws)
        )


if __name__ == '__main__':
    print('Type "exit" to quit')
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

  • Вопрос задан
  • 408 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы