如何解决Python币安合约交易中“Event loop is closed”报错?
解决“Event loop is closed”导致币安合约交易程序终止的问题
你的代码核心问题在于嵌套调用asyncio.run(),以及异常处理中错误的循环恢复逻辑:
asyncio.run()会自动创建事件循环,在函数执行完毕后强制关闭循环。当你在main()内部的异常块里再次调用asyncio.run(main())时,外层的asyncio.run()已经关闭了循环,内层调用会直接触发“Event loop is closed”错误。- 事件循环策略(比如Windows的
WindowsSelectorEventLoopPolicy)应该在程序启动时设置,而非异常发生后临时修改,否则无法生效。 - 异常处理里的两次尝试逻辑无效,第一次调用
asyncio.run()已经关闭了循环,第二次调用必然失败。
修正方案
方案1:手动管理事件循环生命周期
放弃asyncio.run()的自动循环管理,改为手动创建、运行循环,避免自动关闭引发的问题:
import asyncio async def main(): while True: await function_1() await function_2() await function_3() await asyncio.sleep(1) if __name__ == "__main__": # Windows环境提前设置事件循环策略,非Windows环境无需处理 try: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) except AttributeError: pass loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: loop.run_until_complete(main()) except RuntimeError as e: if "Event loop is closed" in str(e): # 重新创建循环并启动 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(main()) finally: loop.close()
方案2:优化异常恢复逻辑
如果坚持使用asyncio.run(),将循环启动逻辑抽离到单独函数,避免嵌套调用:
import asyncio async def main(): while True: await function_1() await function_2() await function_3() await asyncio.sleep(1) def run_main(): try: asyncio.run(main()) except RuntimeError as e: if "Event loop is closed" in str(e): # 重新启动循环入口 run_main() if __name__ == "__main__": # Windows环境提前设置策略 try: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) except AttributeError: pass run_main()
额外注意事项
- 检查
function_1/2/3内部是否存在手动关闭事件循环的代码,这是导致循环提前关闭的常见诱因。 - 给每个异步函数单独添加异常处理,避免单个函数因网络问题、API限制报错时,直接终止整个循环。
内容的提问来源于stack exchange,提问作者NAM
相关产品推荐
相关产品推荐

