我正在 asyncio 上运行最简单的示例:
import asyncio
async def main():
print("A")
await asyncio.sleep.sleep(1)
print("B")
asyncio.run(main())
我收到运行时错误: RuntimeError:无法从正在运行的事件循环调用 asyncio.run()
我在 M1 Mac 上使用 Spyder (Python 3.9)(...如果这很重要的话)。
预期结果是:
A
B
进程已完成,退出代码为 0
但是对于“.sleep.sleep”,此代码很好 - “事件循环已在运行”对于具有此代码的独立脚本来说当然不是问题。
也许您正在将其作为笔记本单元运行,并且已经设置了一些异步状态?
在 bash 终端中,我按原样粘贴了您的代码,只是替换了不正确的函数名称:
[gwidion@fedora tmp01]$ cat >bla42.py
import asyncio
async def main():
print("A")
await asyncio.sleep.sleep(1)
print("B")
asyncio.run(main())
[gwidion@fedora tmp01]$ python bla42.py
A
Traceback (most recent call last):
[...]
File "/home/gwidion/tmp01/bla42.py", line 5, in main
await asyncio.sleep.sleep(1)
AttributeError: 'function' object has no attribute 'sleep'
[gwidion@fedora tmp01]$ python -c 'open("bla43.py", "w").write(open("bla42.py").read().replace(".sleep.sleep", ".sleep"))'
[gwidion@fedora tmp01]$ python bla43.py
A
B
[gwidion@fedora tmp01]$
您是否从 iPython、Spyder、Jupyter 或类似工具运行脚本?
如果是这样,则会发生错误,因为这些环境已经在运行事件循环。因此,当您从这些环境运行脚本时,您的 python 程序实际上是在一个更大的程序的上下文中运行,该程序已经有一个事件循环。
以下是同一问题的链接: Spyder 中的“运行时错误:无法从正在运行的事件循环中调用 asyncio.run()”
有多种解决方法。最简单的是:直接从终端/命令行运行脚本:
$ python script.py