如何使用asyncio实现异步处理?优化生成器与处理器执行耗时
使用asyncio实现异步生成与处理,缩短总耗时
原代码的核心问题是全串行阻塞执行:生成器的sleep(1)和处理器的sleep(2)都是同步阻塞调用,导致下一个数字必须等上一个处理完才能生成,完全没有并发效率,这才会出现要等很久才能打印出2 is even的情况。
要把总耗时压到4秒,得把生成和处理改成异步模式,让两者能同时进行,具体改造如下:
改造后的完整代码
import asyncio from datetime import datetime async def async_generator(): i = 0 while True: yield i i += 1 await asyncio.sleep(1) # 换成异步睡眠,不卡住事件循环 async def async_handler(number): await asyncio.sleep(2) # 同样用异步睡眠,让其他任务能并行执行 if number % 2 == 0: print(f"{datetime.now().strftime('%H:%M:%S')} - {number} is even") else: print(f"{datetime.now().strftime('%H:%M:%S')} - {number} is odd") async def main(): tasks = [] async for number in async_generator(): # 每生成一个数字,立刻创建异步任务丢进事件循环执行 task = asyncio.create_task(async_handler(number)) tasks.append(task) # 处理到数字2后停止,验证耗时效果 if number == 2: await asyncio.gather(*tasks) break if __name__ == "__main__": start = datetime.now() print(f"启动时间:{start.strftime('%H:%M:%S')}") asyncio.run(main()) print(f"总耗时:{(datetime.now() - start).total_seconds()}秒")
为什么能缩短到4秒?
- 异步生成器
async_generator每秒生成一个数字,但它的await asyncio.sleep(1)会释放事件循环,不会卡住后续的处理任务 - 每生成一个数字就立刻启动一个异步处理任务,三个处理任务(0、1、2)是并发执行的:
- 0在0秒生成,处理耗时2秒,2秒完成
- 1在1秒生成,处理耗时2秒,3秒完成
- 2在2秒生成,处理耗时2秒,4秒完成
- 从启动到最后一个任务完成,总耗时就是生成到2的时间(2秒)加上处理2的时间(2秒),总共4秒
实际执行输出示例
启动时间:14:35:00 14:35:02 - 0 is even 14:35:03 - 1 is odd 14:35:04 - 2 is even 总耗时:4.002秒
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

