在Spyder中运行asyncio示例报错:asyncio.run()无法从运行的事件循环调用
解决asyncio.run()报错及代码错误问题
首先修正代码里的低级错误:你写的await asyncio.sleep.sleep(1)是错误调用,正确的应该是await asyncio.sleep(1)——asyncio.sleep本身就是一个协程函数,不需要再调用它的sleep属性。
接下来解决RuntimeError: asyncio.run() cannot be called from a running event loop的问题:
Spyder的IPython控制台默认会自动启动一个asyncio事件循环,而asyncio.run()的设计是用来创建并管理一个全新的事件循环,当检测到当前已有运行中的循环时就会抛出这个错误。
给你两种解决方案:
方案1:适配已有事件循环修改代码
直接利用Spyder已经启动的循环来运行你的协程,修改代码如下:
import asyncio async def main(): print("A") await asyncio.sleep(1) print("B") # 处理已有循环的情况 try: loop = asyncio.get_running_loop() # 提交任务到已有循环 task = loop.create_task(main()) # 如果需要等待任务完成(脚本运行场景),可以添加await # await task except RuntimeError: # 没有运行中循环时,用asyncio.run() asyncio.run(main())
如果是在Spyder的IPython控制台里直接运行,甚至可以简化成直接执行await main(),不需要调用asyncio.run()。
方案2:修改Spyder设置禁用默认事件循环
- 打开Spyder的
Preferences(偏好设置) - 进入
IPython console->Advanced settings - 取消勾选
Enable GUI event loop integration选项 - 重启Spyder后,你的原代码(修正sleep调用后)就可以正常用
asyncio.run()执行了
内容的提问来源于stack exchange,提问作者DiN0
相关产品推荐
相关产品推荐

