使用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
相关产品推荐
相关产品推荐

