小编Mor*_*the的帖子

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

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

python multithreading asynchronous

5
推荐指数
0
解决办法
961
查看次数

标签 统计

asynchronous ×1

multithreading ×1

python ×1