You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:20:27