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

使用asyncio.run()出现RuntimeError: Event loop is closed的原因疑问

问题原因与解决办法

为什么asyncio.run()会报Event loop closed错误?

asyncio.run()是Python3.7+推出的高阶API,核心逻辑是:创建全新事件循环→运行传入协程→运行结束后自动关闭循环。你遇到的错误,几乎都是因为aiohttp的ClientSession未被正确关闭,导致循环关闭后还有残留的异步IO操作(比如未完成的连接清理)试图访问已关闭的事件循环。

而用loop.run_until_complete(main())时,默认事件循环不会被自动关闭,残留操作还能在循环内完成,所以不会报错,但这个API已被标记为过时,官方明确推荐使用asyncio.run()。

解决步骤

规范ClientSession的使用方式,优先用上下文管理器自动处理生命周期:

import asyncio
import aiohttp

async def fetch_data(session, url):
    async with session.get(url) as response:
        return await response.json()

async def main():
    # 用async with自动管理ClientSession的创建与关闭
    async with aiohttp.ClientSession() as session:
        data = await fetch_data(session, "https://api.example.com/data")
        print(data)

if __name__ == "__main__":
    asyncio.run(main())

如果是手动创建ClientSession,必须在main函数末尾手动关闭,确保所有异步操作在循环关闭前完成:

async def main():
    session = aiohttp.ClientSession()
    try:
        data = await fetch_data(session, "https://api.example.com/data")
        print(data)
    finally:
        await session.close()

额外注意

  • 不要在asyncio.run()之外手动创建或操作事件循环,高阶API的设计目的就是简化循环管理流程
  • 所有依赖事件循环的异步操作,必须在asyncio.run()运行的协程内部完成,不能留到循环关闭后执行

内容的提问来源于stack exchange,提问作者Biswadeep Sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 15:50:17