我试图在python中创建一个脚本,它使用websockets和asyncio监听多个套接字,问题是无论我做什么,它都只监听我调用的第一个套接字。我认为这是无限循环,我有什么选择来解决这个问题?为每个套接字使用线程?
async def start_socket(self, event):
payload = json.dumps(event)
loop = asyncio.get_event_loop()
self.tasks.append(loop.create_task(
self.subscribe(event)))
# this should not block the rest of the code
await asyncio.gather(*tasks)
def test(self):
# I want to be able to add corotines at a different time
self.start_socket(event1)
# some code
self.start_socket(event2)
3条答案
按热度按时间xlpyo6sf1#
这就是我最终所做的,这样就不会阻塞主线程,所有订阅都并行工作。
rxztt3cl2#
你的代码看起来不完整,但是你所展示的有两个问题。一个是
run_until_complete
接受一个协程对象(或其他类型的未来),而不是一个协程函数。所以它应该是:问题是,无论我做什么,它只监听我调用的第一个套接字。我认为这是无限循环,我有什么选择来解决这个问题?为每个套接字使用线程?
无限循环不是问题,asyncio被设计为支持这种“无限循环”。问题是你试图在一个协程中完成所有事情,而你应该为每个WebSocket创建一个协程。这不是问题,因为协程非常轻量级。
例如(未测试):
fcy6dtqo3#
一种有效地监听来自websocket服务器的多个WebSocket连接的方法是保留一个连接的客户端列表,并基本上并行处理多个会话。
例如,一个简单的服务器每隔几秒向每个连接的客户端发送随机#:
一个简单的客户端,连接到服务器并侦听数字:
将线程和
asyncio
混合在一起会带来更多的麻烦,而且您仍然有代码会阻塞最浪费的步骤,如网络IO(这是使用asyncio
的基本好处)。您需要在事件循环中异步运行每个协程,使用
await
调用任何阻塞调用,并使用async
定义与任何可等待交互交互的每个方法参见工作示例:https://github.com/adnantium/websocket_client_server