Python同步与asyncio异步编程疑问:为何写法1未并行执行?
Python同步与asyncio异步编程对比:你的疑问解答
场景回顾
作为机器学习工程师,你模拟的服务逻辑有明确要求:
preprocess必须优先执行,输出作为predict和apply_business_logic的输入predict与apply_business_logic相互独立,理论上异步执行能提升效率- 最终通过加权平均两者输出得到结果
下面针对你的疑问逐一解答:
1. 同步执行与写法2的差异是什么?
先明确两种写法的核心逻辑:
- 同步代码:所有函数都是普通阻塞函数,执行时会占用线程直到完成,CPU在函数运行期间无法处理其他任务(比如
time.sleep会直接卡住线程)。 - 写法2(伪异步):函数用
async定义为协程,调用时用await,但因为是顺序await(先等predict完成再启动apply_business_logic),所以执行流程和同步完全一致。
两者的差异仅在于底层执行机制:
- 同步函数的阻塞是强制线程暂停,CPU只能空等;
- 协程的阻塞是主动让出CPU权限(仅当函数内有IO等待逻辑时,比如
asyncio.sleep、异步IO操作),但如果没有其他待执行的协程,让出CPU也没用,整体耗时和同步几乎一样。
如果你的predict和apply_business_logic是CPU密集型任务(比如大量矩阵运算),写法2和同步代码没有效率差异——因为asyncio是单线程模型,CPU密集型协程不会主动让出CPU,依然串行执行。
2. 写法2用了async/await却顺序执行,是不是没实现异步?
是的,写法2没有实现真正的异步并发。
异步并发的核心是同时调度多个协程执行,而写法2只是把同步函数改成了协程,却依然按顺序等待每个协程完成,本质还是串行执行。
举个直观的代码对比:
写法2(伪异步,串行执行)
import asyncio async def preprocess(data): return data async def predict(data): await asyncio.sleep(2) # 模拟IO/耗时操作 return 0.8 async def apply_business_logic(data): await asyncio.sleep(2) return 0.6 async def main(): processed = await preprocess("raw_data") # 顺序await,先等predict完成再执行apply_business_logic pred = await predict(processed) bl = await apply_business_logic(processed) result = 0.7 * pred + 0.3 * bl print(result) asyncio.run(main()) # 总耗时约4秒
正确的异步写法(写法3,并发执行)
async def main(): processed = await preprocess("raw_data") # 同时创建并启动两个协程任务 task_pred = asyncio.create_task(predict(processed)) task_bl = asyncio.create_task(apply_business_logic(processed)) # 等待两个任务都完成 pred = await task_pred bl = await task_bl # 或用asyncio.gather简化:pred, bl = await asyncio.gather(predict(processed), apply_business_logic(processed)) result = 0.7 * pred + 0.3 * bl print(result) asyncio.run(main()) # 总耗时约2秒
只有像写法3这样,通过asyncio.create_task或asyncio.gather同时启动多个协程,才能让predict和apply_business_logic并发执行,真正发挥异步的效率优势。
内容的提问来源于stack exchange,提问作者YounghunJo
相关产品推荐
相关产品推荐

