如何从另一个线程向连接的websocket客户端发送内容?

时间:2016-11-03 14:16:56

标签: python multithreading asynchronous

我正在编写一个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()

0 个答案:

没有答案