IPython中如何关闭运行中的asyncio事件循环而不导致内核崩溃?
问题原因
IPython 7.0及以上版本默认内置asyncio支持,启动时会自动拉起一个持久运行的事件循环作为内核依赖组件。你遇到的RuntimeError: This event loop is already running报错,本质是非异步版本get_json的内部实现调用了asyncio.run()或loop.run_until_complete()这类尝试启动新事件循环的逻辑,检测到已有循环处于运行状态才抛出异常。
你直接调用asyncio.get_event_loop().stop()会直接终止IPython内核依赖的运行时循环,所以必然触发内核崩溃。重启IPython也没用的原因是,IPython每次启动都会重新拉起这个默认循环,问题根源没有被解决。
解决方案
- 方案1:给事件循环打嵌套运行补丁(最便捷)
安装nest_asyncio,允许事件循环嵌套运行,不需要关闭IPython默认循环:
pip install nest_asyncio
在IPython中执行以下代码后即可正常运行非异步版本get_json:
import nest_asyncio nest_asyncio.apply()
- 方案2:换用普通Python交互环境
如果你需要完全自主管理事件循环的生命周期,不要使用IPython交互环境,切换到原生Python交互式shell即可。该环境不会默认启动事件循环,你可以自行创建、运行、关闭循环,不会触发内核崩溃问题。 - 方案3:统一使用异步API
你已经处于IPython的异步运行环境中,直接await调用异步版本的get_json即可,不需要额外使用同步封装的版本,逻辑上更合理。
内容的提问来源于stack exchange,提问作者j7skov
相关产品推荐
相关产品推荐

