Python中async里的await与普通执行流程的差异是什么?
Async/Await与普通同步流程的核心差异
核心区别一句话:异步+await是「等待时不浪费时间」,普通同步是「死等到底啥也不干」
从你的场景图拆解
- 普通同步流程(Normal Program):
服务员通知厨房做菜后,就原地等着,直到菜做好才能继续干活。这段等待时间里,服务员完全闲置,没法处理其他任务(比如收拾桌子、招呼其他客人),整体效率极低。 - 异步+await流程(Async Program):
服务员用await kitchen()等待做菜时,会立刻转而去做其他能并行处理的轻量任务(比如收拾桌子),等厨房完成做菜的信号传来,再回到上菜的流程。等待的时间被充分利用了。
技术层面的本质
- 同步代码是阻塞执行:调用普通函数
kitchen()时,当前线程会被完全占用,必须等函数执行完毕(比如菜做好),才能继续执行后面的代码。 - Async/Await是非阻塞等待:
await会把当前的任务暂时挂起,把线程资源让给其他需要运行的任务;当被await的异步任务(通常是IO密集型操作,比如网络请求、文件读写、数据库查询这类不需要CPU一直运算的任务)完成后,再回到挂起的位置继续执行后续代码。
代码示例对比
同步版本(阻塞)
import time def kitchen(): # 模拟做菜耗时5秒(同步阻塞操作) time.sleep(5) return "番茄炒蛋" def waiter(): print("服务员:告知厨房做番茄炒蛋") dish = kitchen() # 这里阻塞5秒,啥也干不了 print(f"服务员:拿到{dish},给客人上菜") print("服务员:收拾客人吃完的桌子") # 只能等上菜后才执行 waiter()
执行流程:通知做菜 → 等5秒 → 上菜 → 收拾桌子,总耗时约5秒,等待期间无额外工作。
异步版本(非阻塞等待)
import asyncio async def kitchen(): # 模拟异步做菜(比如调用后厨系统、等待食材准备这类IO操作) await asyncio.sleep(5) return "番茄炒蛋" async def waiter(): print("服务员:告知厨房做番茄炒蛋") # 先启动厨房任务,不立刻等待 dish_task = asyncio.create_task(kitchen()) print("服务员:趁做菜的空,先收拾隔壁桌") # 直接执行,不等待 # 等厨房做好菜,再继续 dish = await dish_task print(f"服务员:拿到{dish},给客人上菜") asyncio.run(waiter())
执行流程:通知做菜 → 收拾桌子(同时厨房在做菜) → 上菜,总耗时还是约5秒,但期间完成了额外的收拾桌子工作,整体效率提升。
内容的提问来源于stack exchange,提问作者Suganth
相关产品推荐
相关产品推荐

