我有一个可以通过websocket端点使用的python服务器。 在服务连接期间,它也与一些后端服务进行通信。这种通信是异步的,可能会触发websocket的send()方法。Python websocket卡住
当一个客户端供应,似乎工作正常。但是,当并行服务多个客户端时,处理连接的一些例程偶尔会卡住。更确切地说,它似乎阻止了recv()方法。
实际的代码是有点复杂,问题会更复杂一些比我所描述的,不过,我提供最少的代码框架是素描的方式,我用他的WebSockets:
class MinimalConversation(object):
def __init__(self, ws, worker_sck, messages, should_continue_conversation, should_continue_listen):
self.ws = ws
self.messages = messages
self.worker_sck = worker_sck
self.should_continue_conversation = should_continue_conversation
self.should_continue_listen = should_continue_listen
async def run_conversation(self):
serving_future = asyncio.ensure_future(self.serve_connection())
listening_future = asyncio.ensure_future(self.handle_worker())
await asyncio.wait([serving_future, listening_future], return_when=asyncio.ALL_COMPLETED)
async def serve_connection(self):
while self.should_continue_conversation():
await self.ws.recv()
logger.debug("Message received")
self.sleep_randomly(10, 5)
await self.worker_sck.send(b"Dummy")
async def handle_worker(self):
while self.should_continue_listen():
self.sleep_randomly(50, 40)
await self.worker_sck.recv()
await self.ws.send(self.messages.pop())
def sleep_randomly(self, mean, dev):
delta = random.randint(1, dev)/1000
if random.random() < .5:
delta *= -1
time.sleep(mean/1000 + delta)
显然,在真实的代码中,我不会随机间隔休眠,也不会使用给定的消息列表,但是这将勾画出我处理websocket的方式。在真实环境中,可能会发生通过websocket发送的错误,因此理论上可能会发生并行发送(),但我从未遇到过这种情况。
该代码是从),其被作为参数传递到websockets.serve(一个处理程序函数运行,初始化MinimalConversation对象,并调用run_conversation()方法。
我的问题是:
- 有什么根本性的错误的的WebSockets的这种用法?
- send()方法的并发调用是否危险?
- 你可以提出一些有关websockets和asyncio使用的良好做法吗?
Thak你。