Задать вопрос
MAKAPOH
@MAKAPOH
многостаночник

Работа с websockets в aiohttp, как организовать двунаправленный обмен?

Добрый день. Никак не соображу как мне организовать двунаправленный обмен данными через websocket соединение в aiohttp. Например вот есть такой обработчик:
import asyncio

q_transmit = asyncio.Queue()
q_receive = asyncio.Queue()

@asyncio.coroutine
def websocket_handler(request):
    ws = web.WebSocketResponse()
    ws.start(request)
    while True:
        # input_msg = yield from ws.receive()
        # yield from q_receive.put(input_msg)
        output_msg = yield from q_transmit.get()
        ws.send_str(output_msg)
    return ws

Есть очередь q_transmit через которую поступают сообщения для конкретного соединения и я их отправляю клиенту, но куда мне воткнуть закоментированные строки для приёма сообщений от клиента для меня пока загадка. Ведь в данном случае пока один из операторов yield from не завершится то второй не начнётся и получается что я могу либо принимать сообщения либо отправлять. Как сделать так что бы можно было и принимать сообщения и отправлять и делать это незавсимо?
  • Вопрос задан
  • 2662 просмотра
Подписаться 6 Оценить Комментировать
Решения вопроса 1
mututunus
@mututunus
Backend developer (Python, Golang)
import asyncio

q_transmit = asyncio.Queue()
q_receive = asyncio.Queue()


@asyncio.coroutine
def check_queue(ws):
    while True:
        output_msg = yield from q_transmit.get()
        ws.send_str(output_msg)


@asyncio.coroutine
def websocket_handler(request):
    ws = web.WebSocketResponse()
    ws.start(request)

    loop.call_soon(asyncio.async, check_queue(ws))

    while True:
        msg = yield from ws.receive()

    return ws
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы