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

使用asyncio.run()后调用get_event_loop触发RuntimeError的原因及文档依据

asyncio RuntimeError 报错原因分析

报错原因

直接原因是调用asyncio.run()后,主线程的当前事件循环已被关闭,此时asyncio.get_event_loop()无法获取到可用的事件循环,从而触发RuntimeError: There is no current event loop in thread 'MainThread'。

关于asyncio.run()的行为

没错,asyncio.run()确实会创建临时事件循环并在执行完毕后关闭它:

  • 该函数会自动创建一个独立的事件循环,用于运行传入的协程;
  • 协程执行完成后,它会关闭这个循环,同时清除当前线程与该循环的关联状态。

官方文档的相关说明

官方文档明确了asyncio.run()的设计逻辑:

  • 它是asyncio程序的标准主入口点,负责完整管理事件循环的生命周期(创建、运行、关闭);
  • 调用后,当前线程不会保留可用的事件循环;
  • 不建议在已有事件循环的线程中调用该函数,也不适合在同一个线程中多次调用(除非手动重新设置事件循环)。

代码修复示例

如果需要在执行完初始协程后继续运行事件循环,可以修改代码如下:

方式一:用单个协程管理所有逻辑

import asyncio

async def task():
    print("executing task")

async def main():
    await task()
    # 用一个永久等待的事件保持循环运行
    await asyncio.Event().wait()

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

方式二:手动管理事件循环

import asyncio

async def task():
    print("executing task")

def main():
    # 手动创建并设置事件循环
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    # 运行初始协程
    loop.run_until_complete(task())
    # 持续运行循环
    loop.run_forever()

if __name__ == '__main__':
    main()

内容的提问来源于stack exchange,提问作者George J Padayatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:02:46