异步运行函数的方式之间的差异



两者之间有什么区别?

asyncio.run(func())

loop = asyncio.get_event_loop()
loop.run_until_complete(func())

据我了解,不同之处在于,如果我在已经具有event_loop的程序中使用第一个示例,则会发生冲突。

查看asyncio.run的来源会给你答案:

def run(main, *, debug=False):
"""Execute the coroutine and return the result.
This function runs the passed coroutine, taking care of
managing the asyncio event loop and finalizing asynchronous
generators.
This function cannot be called when another asyncio event loop is
running in the same thread.
If debug is True, the event loop will be run in debug mode.
This function always creates a new event loop and closes it at the end.
It should be used as a main entry point for asyncio programs, and should
ideally only be called once.
Example:
async def main():
await asyncio.sleep(1)
print('hello')
asyncio.run(main())
"""
if events._get_running_loop() is not None:
raise RuntimeError(
"asyncio.run() cannot be called from a running event loop")
if not coroutines.iscoroutine(main):
raise ValueError("a coroutine was expected, got {!r}".format(main))
loop = events.new_event_loop()
try:
events.set_event_loop(loop)
loop.set_debug(debug)
return loop.run_until_complete(main)
finally:
try:
_cancel_all_tasks(loop)
loop.run_until_complete(loop.shutdown_asyncgens())
loop.run_until_complete(loop.shutdown_default_executor())
finally:
events.set_event_loop(None)
loop.close()

如您所见,如果循环已在当前线程中运行,它会抛出异常,然后创建自己的循环并在其上调用run_until_complete。与第二个代码片段相比,其他附加部分是,它会验证您传递给它的函数是否是协程,并且在您传递给它的协程完成后,它会干净地关闭所有内容。

正如其文档字符串所说,它旨在用作asyncio应用程序的入口点。

相关内容

最新更新