push с python + asyncio + websockets = пропущенные сообщения - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать сервер веб-сокетов, на котором один клиент будет отправлять свои сообщения (я знаю, что это не обычный способ использовать веб-сокет, но эта часть не мой выбор). Для этого я использую Python 3.7 и websockets 7.0.

Моя проблема: Многочисленные сообщения, отправленные клиентом, не принимаются сервером . Вот простой код, который я использую.

import asyncio
import websockets


async def get_tag_data(websocket, path):
    # print('received')
    data = await websocket.recv()
    print(data)


loop = asyncio.get_event_loop()
anchors_server = websockets.serve(get_tag_data, 'localhost', 9001)
loop.run_until_complete(asyncio.gather(anchors_server))
loop.run_forever()

И наоборот, когда я пытаюсь использовать python-websocket-server (который использует потоки для приема), все мои сообщения принимаются правильно.

Насколько я понимаю, asyncio & websockets, он должен управлять противодавлением : сообщения, отправленные, когда сервер занят (для обработки старых сообщений), "буферизируются" и будут обрабатываться в ближайшее время ... .

Чего мне не хватает? Нужно ли связывать прием websocket с asyncio, чтобы избежать потери сообщений?

Спасибо за ваши ответы!

1 Ответ

0 голосов
/ 10 января 2019

Хорошо, я понял. Моя функция работала только один раз, следующие сообщения не буферизировались. Следующий код решает проблему:

import asyncio
import websockets
import signal
import sys

async def get_tag_data(websocket, path):
    while True:
        async for data in websocket:
            print(data)

loop = asyncio.get_event_loop()
anchors_server = websockets.serve(get_tag_data, '', 9001)
loop.run_until_complete(asyncio.gather(anchors_server))
loop.run_forever()

обратите внимание на

while True:
    async for data in websocket
...