You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:47:04