在Python中向多个websocket连接发送数据

在Python中向多个websocket连接发送数据,python,multithreading,websocket,server,Python,Multithreading,Websocket,Server,我有一个服务器,它从一堆GPS跟踪器收集数据,并希望通过WebSocket将这些数据实时发送到X连接的客户端。跟踪器通过TCP连接(每个跟踪器在各自的线程中),并定期向服务器发送数据。数据合并到一个名为data\u merge的线程中,并放入该线程queue()。这个机制工作得很好,正如预期的那样,但是当我想将数据发送到websocket连接时遇到了问题 我试着将我的解决方案基于,因为这似乎适用于我的用例。我有一个名为outbound\u worker的线程来处理websocket代码。从线程运

我有一个服务器,它从一堆GPS跟踪器收集数据,并希望通过WebSocket将这些数据实时发送到X连接的客户端。跟踪器通过TCP连接(每个跟踪器在各自的线程中),并定期向服务器发送数据。数据合并到一个名为
data\u merge
的线程中,并放入该线程
queue()
。这个机制工作得很好,正如预期的那样,但是当我想将数据发送到websocket连接时遇到了问题

我试着将我的解决方案基于,因为这似乎适用于我的用例。我有一个名为
outbound\u worker
的线程来处理websocket代码。从
线程运行()

def运行(自):
self.data\u merge.name='data\u merge'
self.data_merge.start()
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
start\u server=websockets.service(self.handle\u客户端,'localhost',self.port)
打印(“WebSocker服务器为端口%s在%s“%处启动(self.port,datetime.now()))
循环。运行\u直到\u完成(启动\u服务器)
asyncio.get_event_loop().永远运行_()
然后,websocket服务器的处理程序方法:

async def handle_客户端(self、websocket、path):
尽管如此:
尝试:
#将websocket注册到连接集
等待自我注册(websocket)
data=self.data\u merge.queue.get()
等待发送到客户端(数据)
等待异步睡眠(0.1)
除websockets.ConnectionClosed外:
打印(“连接关闭”)
等待自我注销(websocket)
打破
异步def发送到客户端(自身、数据):
data=json.dumps(数据)
如果自连接:
wait asyncio.wait([ws.send(数据)用于self.connected中的ws])
register()
unregister()
方法与上面链接的示例相同。我使用的客户端是一个基本循环,用于打印接收到的数据:

async def hello():
uri=“ws://localhost:64000”
尽管如此:
与websocket异步。作为websocket连接(uri):
打印(“等待数据…”)
data=wait websocket.recv()
#打印(f“{data}”)
打印(f“{json.loads(data)}”)
asyncio.get_event_loop()。运行_直到完成(hello())
由于我通常不熟悉Python和WebSocket中的异步调用,因此我不确定我的方法是否正确。由于我试图在注册新连接后立即推送数据,因此代码似乎在
wait send\u to_clients(data)
行停止。我应该在
data\u merge
线程中处理这个问题并传递
connected
集合吗

另一个问题是,如果我简单地使用
client\u处理程序
register()
unregister()
新连接,它似乎只是在
register()
部分上循环,我无法连接第二个客户端

我想我的问题可以概括如下:

  • 与多线程套接字服务器类似,如何通过websocket接受和管理多个打开的连接

  • 是否有方法触发函数调用(例如
    register()
    仅在新的websocket连接上,类似于
    socket.listen()
    socket.accept()


您可能应该查看“消息代理”和发布/订阅(发布/订阅)模式。您不仅复制了大量现有工作,而且还以次优的方式进行,因此随着基础设施的增长,您将面临扩展问题。谢谢,我基本上只需要一个指向正确方向的指针。我会检查一下