使用BinanceSocketManager开发WebSocket时PyLance提示代码不可达
问题结论
这个PyLance提示不是检测bug,你的代码逻辑确实导致await client.close_connection()为不可达代码。
原因分析
- 首先
while True是无限死循环,代码中没有设置break、return这类常规跳出循环的逻辑,只要价格阈值条件没有触发,循环会永久运行,永远走不出async with代码块,自然不可能执行块后的关闭连接逻辑。 - 就算价格阈值条件触发,你执行的
loop.stop()是直接终止整个异步事件循环的运行,不会回到当前main协程继续执行后续代码,连async with的上下文自动退出逻辑都不会正常执行,更不可能走到后续的连接关闭代码。
修复方案
将触发条件里的loop.stop()替换为break,先正常跳出while循环,此时会自动执行async with的上下文回收逻辑关闭trade socket,之后就能正常执行后续的客户端连接关闭代码。如果确实需要在下单完成后终止事件循环,可以把loop.stop()放在关闭连接的代码之后执行。
修改后的参考代码:
async def main(coin): bm = BinanceSocketManager(client) ts = bm.trade_socket(coin) async with ts as tscm: while True: res = await tscm.recv() if res: frame = createframe(res) if frame.Price[0] < buyprice * 0.97 or frame.Price[0] > 1.005 * buyprice: order = client.create_order(symbol=coin, side='SELL', type='MARKET', quantity=buy_quantity) print(order) break # 替换原有loop.stop(),先跳出循环 await client.close_connection() # 如果需要终止事件循环,放在这里执行 loop.stop()
内容的提问来源于stack exchange,提问作者Berkant Dirim
相关产品推荐
相关产品推荐

