我正在编写一个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()
因为我希望我的程序也能进行信号处理,并且loop.run_forever()是一个阻塞调用,所以在启动服务器之前创建一个无限的工作线程。这可以按预期工作。
当工作线程检测到信号变化时,它必须警告连接的websocket客户端。但是一个简单的client.send()不起作用。等待在它前面也不起作用(因为这只在协同程序中起作用,我认为)。我尝试制作一个单独的" 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 = signalHandler)
signalThread.setDaemon(True)
signalThread.start()
loop = asyncio.get_event_loop()
loop.run_until_complete(start_server)
loop.run_forever()