用python + asyncio + websockets推送=缺少消息

时间:2019-01-07 15:22:59

标签: python python-3.x websocket python-asyncio python-multithreading

我正在尝试创建一个Websocket服务器,单个客户端将在其上推送其消息(我知道这不是使用websocket的常用方法,但这不是我的选择)。为此,我正在使用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应该用于管理backpressure:服务器忙时发送的消息(用于处理较旧的消息)将被“缓冲”,并将很快得到处理。...< / p>

我想念什么?我是否需要将Websocket接收与asyncio线程化以避免丢失消息?

谢谢您的回答!

1 个答案:

答案 0 :(得分:0)

好的,我明白了。 我的函数仅运行一次,下一条消息未缓冲。以下代码解决了该问题:

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