我正在编写一个 Python 3.5 程序,它处理一些信号并将这些数据提供给少量的 websocket 客户端。我希望 websocket 服务器和信号处理发生在同一个程序中,因此我使用线程。
问题是我不知道如何将数据从工作线程发送到客户端。
Websocket 服务器是通过一个名为“websockets”的简单库实现的。服务器已设置完毕,客户端可以在“新的 websocket 客户端已连接”处理程序中连接并与服务器通信。
服务器是在事件循环的帮助下设置的:
start_server = websockets.serve(newWsHandler, host, port)
loop = asyncio.get_event_loop()
loop.run_until_complete(start_server)
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
因为我希望我的程序也进行信号处理,并且loop.run_forever()是一个阻塞调用,所以我在启动服务器之前创建了一个无限的工作线程。这按预期工作。
当工作线程检测到信号变化时,它必须向连接的 websocket 客户端发出警报。但简单的 client.send() 不起作用。将await放在它前面也不起作用(因为我认为它只在协程中有效)。我尝试制作一个单独的“async def”函数并将其添加到事件循环中,但它变得有点复杂,因为它不在同一线程上。
所以主要问题是:从工作线程向 websocket 客户端发送内容的最佳方式是什么?我没有收到任何回复。
编辑:如果我添加一些模拟代码,它可能会有所帮助。
def signalHandler():
#check signals
...
if alert:
connections[0].send("Alert") #NEED HELP HERE
async def newWsHandler(websocket, path):
connections.append(websocket)
while True:
#keep the connection open until the client disconnects
msg = await websocket.recv()
#top level
connections = []
...
start_server = websockets.serve(newWsHandler, host, port)
signalThread = Thread(target = …Run Code Online (Sandbox Code Playgroud)