Spyder运行asyncio代码报错:无法操作正在运行的事件循环
报错原因
Spyder基于IPython内核运行代码,IPython 7.0及以上版本默认会预先启动一个asyncio事件循环,用于支持交互式环境下的异步代码执行;同时Spyder自身基于Qt框架开发,也会常驻运行Qt事件循环,和asyncio事件循环做了集成。因此你在脚本中手动新建事件循环并调用run_until_complete()时,就会触发RuntimeError: Cannot run the event loop while another loop is running报错。
而CMD下运行代码时是启动独立的纯Python进程,没有预先运行的事件循环,因此代码可以正常执行。
解决方案
下面三个方案任选其一即可:
- 方案1:使用nest_asyncio补丁允许事件循环嵌套
这是改动最小的方案,先执行安装命令:pip install nest_asyncio,之后在你的代码开头添加两行代码,原有其余代码不需要修改:import nest_asyncio nest_asyncio.apply() - 方案2:复用当前已运行的事件循环
不需要新建事件循环,直接获取当前环境已存在的事件循环运行协程即可,注意不要关闭该循环(否则会导致Spyder内核异常),替换原有循环相关代码为:loop = asyncio.get_event_loop() loop.run_until_complete(myWork()) - 方案3:修改Spyder运行配置,使用独立进程执行脚本
点击顶部菜单栏「运行」→「配置每文件运行选项」,勾选「在新的专用Python解释器中执行」后保存。之后运行脚本会启动独立Python进程,和CMD运行环境完全一致,不会出现循环冲突问题。
额外提示:你的脚本文件名是
async.py,和Python标准库异步模块的命名冲突,建议修改为其他文件名(比如async_demo.py),避免后续出现导入异常。
内容的提问来源于stack exchange,提问作者Matija Cerne
相关产品推荐
相关产品推荐

