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

