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

Python中RuntimeError: Cannot close a running event loop错误的解决办法

解决"RuntimeError: Cannot close a running event loop"的方法

问题原因

调用loop.stop()后立即执行loop.close()会报错,是因为loop.stop()并不会让事件循环立即停止——它只是给事件循环发送一个停止信号,当前正在执行的协程会继续完成,此时事件循环仍处于运行状态,直接调用close()就会触发错误。

解决方案1:在run_forever()返回后调用loop.close()

把loop.close()移到loop.run_forever()之后执行,因为run_forever()会一直阻塞直到loop.stop()被调用并生效,此时事件循环已经完全停止,再关闭就不会报错:

import asyncio

async def test(loop):
    print("Test")
    loop.stop()  # 发送停止信号

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

loop.create_task(test(loop))

loop.run_forever()  # 阻塞直到loop停止
loop.close()  # 此时循环已停止,可安全关闭

解决方案2:使用run_until_complete()替代run_forever()

如果你的逻辑不需要长期运行的事件循环,用run_until_complete()会更简洁——它会等待指定协程执行完毕后自动停止事件循环,之后再关闭循环即可:

import asyncio

async def test():
    print("Test")

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

try:
    loop.run_until_complete(test())
finally:
    loop.close()  # 协程执行完,循环已停止,安全关闭

额外说明

事件循环的关闭操作通常应该放在协程外部,作为资源清理的最后一步。如果确实需要在协程内触发关闭,可以通过loop.call_soon安排在循环停止后执行,但这种场景较少见,更推荐上面两种常规方案。

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:10:35