Python asyncio外层循环持续执行问题:任务完成后程序异常退出
问题分析与解决方案
你的程序异常退出(退出码-1),核心问题在于每次循环调用asyncio.run()都会创建全新的事件循环,如果client是绑定到初始事件循环的,后续新循环会导致client状态异常,触发未捕获错误导致程序崩溃。另外,混合同步的time.sleep()和异步代码会阻塞事件循环,不符合异步编程逻辑。
正确写法
把循环逻辑整合到异步主函数中,仅调用一次asyncio.run()启动事件循环,用异步休眠替代同步休眠:
import asyncio from datetime import datetime async def blabla(client): await client.send_message() async def main(): # 在此初始化client,确保绑定到当前事件循环 client = await initialize_client() # 替换为你的client初始化逻辑 while True: scrap_time = datetime.now() print(scrap_time.strftime("%H:%M:%S"), "scraping started ...") await blabla(client) await asyncio.sleep(50) # 异步休眠,不阻塞事件循环 if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: print("程序已终止")
关键改进
- 单事件循环:
asyncio.run(main())管理整个事件循环生命周期,避免重复创建循环引发的资源冲突。 - 异步休眠:
asyncio.sleep()不会卡住线程,事件循环在等待期间可处理其他任务(若有)。 - 统一异步上下文:
client在主循环内初始化,所有异步调用共享同一上下文,避免状态异常。
如果client是同步初始化的,也可在main()外完成,但需确保它适配异步事件循环(多数异步客户端库要求在循环内初始化)。
内容的提问来源于stack exchange,提问作者Mohamad Sh
相关产品推荐
相关产品推荐

