Python 异步/等待函数的基本逻辑

Python 异步/等待函数的基本逻辑,python,asynchronous,async-await,Python,Asynchronous,Async Await,考虑以下两个Python代码片段: 导入异步IO 导入时间 异步定义在(延迟,什么)之后说: 等待异步睡眠(延迟) 打印(什么) 异步def main(): 打印(f“开始于{time.strftime('%X')}”) 等待在(1,‘你好’)之后说 等待在(2,‘世界’)之后说 打印(f“在{time.strftime('%X')}完成”) asyncio.run(main()) 还有这个: 导入时间 def在(延迟,什么)之后说: 时间。睡眠(延迟) 打印(什么) def main():

考虑以下两个Python代码片段:

导入异步IO
导入时间
异步定义在(延迟,什么)之后说:
等待异步睡眠(延迟)
打印(什么)
异步def main():
打印(f“开始于{time.strftime('%X')}”)
等待在(1,‘你好’)之后说
等待在(2,‘世界’)之后说
打印(f“在{time.strftime('%X')}完成”)
asyncio.run(main())
还有这个:

导入时间
def在(延迟,什么)之后说:
时间。睡眠(延迟)
打印(什么)
def main():
打印(f“开始于{time.strftime('%X')}”)
在(1)“你好”之后说“你好”
在(2,“世界”)之后说
打印(f“在{time.strftime('%X')}完成”)
main()
它们产生完全相同的输出,
main()
流在每次函数调用后暂停


那么,在本例中,同步流和异步流之间有什么区别呢?如果主流被暂停/阻塞,那么使用async/sync有什么意义呢?

执行多个等待仍然只会一次向执行循环添加一个等待。您可以使用
await asyncio.gather
添加多个等待

async def main():
    print(f"started at {time.strftime('%X')}")
    await asyncio.gather(say_after(5, 'banana'), say_after(1, 'hello'), say_after(2, 'world'))
    print(f"finished at {time.strftime('%X')}")
会让步

started at 12:12:39
hello
world
banana
finished at 12:12:44

我不是一个异步专家,但我在过去使用过它来运行多个系统的查找等

不是重复的,但您可能会发现它非常有用:非常有用,但我仍然不明白执行第一个代码段中说明的东西的要点是什么。如果wait阻塞了调用行的代码执行,为什么还要麻烦将函数声明为异步函数并使用wait调用它呢?这与执行同步函数调用不是一回事吗?因此,如果没有
async
,那么就根本无法异步调用函数
Wait
将告诉Python异步执行函数,但Python只能作为
gather
或事件循环
asyncio.get\u event\u loop()
的一部分来执行,否则它只能异步运行一个命令,这与顺序运行相同。看看这个,我发现它在尝试异步时很有用