Python websockets单次运行建立多少连接?asyncio搭配使用疑问
问题1:每次执行async with websockets.connect(_websocket_uri) as websocket:是否都会创建新连接?
是,每次执行这条语句都会发起一次全新的WebSocket连接请求。async with是异步上下文管理器语法,进入该上下文时会完成TCP握手、WebSocket协议握手建立完整连接,退出上下文时会自动发送断开帧、关闭底层TCP连接,全程不需要手动处理连接生命周期。
问题2:你当前的代码是否满足「每个URI全程仅建立一次连接」的要求?
满足。
你的代码逻辑中:
connect_to_single_uri调用connect建立连接后,会直接await fetch_data(connected_websocket)fetch_data中用async for message in _websocket迭代接收服务端消息,只要连接没有因为网络波动、服务端主动断开、程序报错等异常终止,这个迭代过程就会持续运行,不会退出async with上下文,也就不会重复触发连接创建逻辑- 外层
connect_to_streams是给集合中的每一个URI创建独立的协程任务并行运行,每个URI对应一个长期存活的连接,不会产生重复连接
问题3:该语句的调用频率应该控制在多少?
只要连接处于正常存活状态,完全不需要重复调用该语句。只有当连接断开后你需要重连时,才需要再次执行该语句。
如果需要实现断线自动重连,可以参考以下方式修改connect_to_single_uri,避免连接中断后程序退出,同时控制重连频率防止被服务端封禁:
async def connect_to_single_uri(_connection_uri: str) -> None: while True: try: async with websockets.connect(_connection_uri, max_queue=None) as connected_websocket: await fetch_data(connected_websocket) except (websockets.exceptions.ConnectionClosed, OSError): # 连接断开后等待2秒再重连,可根据服务端规则调整间隔 await asyncio.sleep(2)
内容的提问来源于stack exchange,提问作者Max AweTery
相关产品推荐
相关产品推荐

