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

