Задать вопрос
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 не завершится то второй не начнётся и получается что я могу либо принимать сообщения либо отправлять. Как сделать так что бы можно было и принимать сообщения и отправлять и делать это незавсимо?
  • Вопрос задан
  • 2673 просмотра
Подписаться 6 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Python-разработчик
    9 месяцев
    Далее
  • Хекслет
    Python-разработчик
    10 месяцев
    Далее
  • SF Education
    Бэкенд-разработчик на Python
    3 месяца
    Далее
  • Stepik
    Программа курсов: Бэкенд-разработка на Python
    1 месяц
    Далее
  • Merion Academy
    Python программист с нуля
    4 месяца
    Далее
  • Skypro
    Python-разработчик с нуля
    9 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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