Python 异步运行函数的不同方法

Python 异步运行函数的不同方法,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,两者的区别是什么 asyncio.run(func()) 及 据我所知,不同之处在于,如果我在已经有事件循环的程序中使用第一个示例,则会发生冲突。查看将给出您的答案: def运行(main,*,debug=False): “”“执行协同程序并返回结果。 此函数运行传递的协程,负责 管理asyncio事件循环并完成异步 发电机。 当调用另一个asyncio事件循环时,无法调用此函数 在同一线程中运行。 如果debug为True,则事件循环将在调试模式下运行。 此函数始终创建一个新的事件循环,并在

两者的区别是什么

asyncio.run(func())

据我所知,不同之处在于,如果我在已经有
事件循环的程序中使用第一个示例,则会发生冲突。

查看将给出您的答案:

def运行(main,*,debug=False):
“”“执行协同程序并返回结果。
此函数运行传递的协程,负责
管理asyncio事件循环并完成异步
发电机。
当调用另一个asyncio事件循环时,无法调用此函数
在同一线程中运行。
如果debug为True,则事件循环将在调试模式下运行。
此函数始终创建一个新的事件循环,并在结束时将其关闭。
它应该用作异步IO程序的主要入口点,并且应该
理想情况下,只能调用一次。
例子:
异步def main():
等待asyncio.sleep(1)
打印('你好')
asyncio.run(main())
"""
如果事件。_get_running_loop()不是无:
引发运行时错误(
“无法从正在运行的事件循环中调用asyncio.run()
如果不是协程.iscoroutine(主):
raise VALUERROR(“应为协同程序,获取{!r}”)。格式(主))
loop=events.new\u event\u loop()
尝试:
事件。设置事件循环(循环)
loop.set_调试(调试)
返回循环。运行直到完成(主)
最后:
尝试:
_取消所有任务(循环)
loop.run_直到_完成(loop.shutdown_asyncgens())
loop.run_直到_完成(loop.shutdown_default_executor())
最后:
事件。设置事件循环(无)
loop.close()
如您所见,如果循环已经在当前线程中运行,它会抛出一个异常,然后创建自己的循环并调用
run\u,直到它完成。与第二个代码段相比,其他额外的部分是,它验证您传递给它的函数是否是一个协程,并且在您传递给它的协程完成后,它可以处理干净地关闭所有东西


正如它的docstring所说,它打算用作
asyncio
应用程序的入口点。

您到底对什么感兴趣?链接到,这显然是许多不同的事情。您是否对实际的差异感兴趣,或者是否应该使用
asyncio.run
来代替旧模式?简而言之,区别在于
asyncio.run
设置了一个新的事件循环,而
run\u until\u complete
可以在同一循环下使用不同的等待项多次调用,可能重用后台任务和其他特定于循环的状态
asyncio.run
几乎肯定是您想要的<“代码>运行直到完成”
现在被认为是专门用途的低级API。@user4815162342我找到了这段代码。我决定去理解你可能打算对@Mistermiagi提出的不同之处。
loop = asyncio.get_event_loop()
loop.run_until_complete(func())