Jav*_*tin 4 python python-asyncio python-3.7
我正在尝试为websockets客户端学习异步。我尝试的每一段代码都会出现以下错误:
RuntimeError:无法从正在运行的事件循环中调用asyncio.run()
我尝试了最简单的代码,它始终会给出RuntimeError。我尝试再次安装完整的anaconda发行版,等等,但找不到问题所在。
我正在将Spyder 3.3.3与Python 3.7.3结合使用
可以正常工作的代码示例:
import asyncio
async def main():
print('hello')
await asyncio.sleep(1)
print('world')
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
错误信息:
File "C:\Users\jmart\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
execfile(filename, namespace)
File "C:\Users\jmart\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/jmart/Documents/asynk2.py", line 8, in <module>
asyncio.run(main())
File "C:\Users\jmart\Anaconda3\lib\asyncio\runners.py", line 34, in run
"asyncio.run() cannot be called from a running event loop")
RuntimeError: asyncio.run() cannot be called from a running event loop
Run Code Online (Sandbox Code Playgroud)
这是与IPython相关的已知问题。
您已经发现的一种方法是使用nest_asyncio:
import nest_asyncio
nest_asyncio.apply()
Run Code Online (Sandbox Code Playgroud)
另一种是安装旧版本的tornado:
pip3 install tornado==4.5.3
Run Code Online (Sandbox Code Playgroud)
小智 5
Spyder 运行自己的事件循环
print(asyncio.get_running_loop().is_running())
Returns: True
Run Code Online (Sandbox Code Playgroud)
但每个线程只允许一个
这就是为什么当我们尝试用
asyncio.run(main())它创建一个新的事件循环时会给我们一个错误:
RuntimeError: asyncio.run() cannot be called from a running event loop
除了我已经提出的 nest_asyncio 和 Tornado 的建议
import asyncio
async def main():
print('Hello world!')
asyncio.create_task(main())
Run Code Online (Sandbox Code Playgroud)

现在代码在新终端中运行并工作
import asyncio
async def main():
print('Hello world!')
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)