使用 python + asyncio + websockets 推送 = 丢失消息
push with python + asyncio + websockets = missing messages
我正在尝试创建一个 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:服务器繁忙时发送的消息(处理较旧的消息)是 "buffered",很快就会处理。 ...
我错过了什么?我是否需要使用 asyncio 对 websocket 接收进行线程处理以避免丢失消息?
感谢您的回答!
好的,我明白了。
我的功能只有一次 运行,下一条消息没有被缓冲。以下代码解决了这个问题:
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
应该没有 while 循环。
import asyncio
import websockets
import signal
import sys
async def get_tag_data(websocket, path):
async for data in websocket:
print(data)
我正在尝试创建一个 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:服务器繁忙时发送的消息(处理较旧的消息)是 "buffered",很快就会处理。 ...
我错过了什么?我是否需要使用 asyncio 对 websocket 接收进行线程处理以避免丢失消息?
感谢您的回答!
好的,我明白了。 我的功能只有一次 运行,下一条消息没有被缓冲。以下代码解决了这个问题:
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
应该没有 while 循环。
import asyncio
import websockets
import signal
import sys
async def get_tag_data(websocket, path):
async for data in websocket:
print(data)