Python进阶实例 第49例:使用 async / await 实现异步协程
来源:     阅读:1
易浩激活码
发布于 2025-10-20 21:53
查看主页

在第48例中,我们学习了基于生成器的“原始协程”模型(使用 yield 与 send())。
从 Python 3.5 开始,官方引入了 async / await 语法,
使协程编程更直观、更易读、更安全。


问题描述:

模拟一个异步网络请求场景:


代码示例:

import asyncioimport time# 异步任务async def fetch_data(name, delay):
    print(f"[{name}] 开始获取数据...")    await asyncio.sleep(delay)  # 模拟网络请求耗时
    print(f"[{name}] 数据获取完成,用时 {delay} 秒。")    return f"{name}_result"# 主协程async def main():
    start = time.time()    # 并发运行三个异步任务
    tasks = [
        fetch_data("任务A", 2),
        fetch_data("任务B", 3),
        fetch_data("任务C", 1)
    ]

    results = await asyncio.gather(*tasks)
    print("
所有任务完成,结果:", results)
    print("总耗时:", time.time() - start, "秒")# 运行异步程序asyncio.run(main())

运行结果示例:

[任务A] 开始获取数据...[任务B] 开始获取数据...[任务C] 开始获取数据...[任务C] 数据获取完成,用时 1 秒。[任务A] 数据获取完成,用时 2 秒。[任务B] 数据获取完成,用时 3 秒。

所有任务完成,结果: ['任务A_result', '任务B_result', '任务C_result']总耗时: 3.00 秒

执行原理解析:

  1. 定义异步函数:
    使用 async def 定义协程函数。
    调用时不会立即执行,而是返回一个 协程对象

  2. await 的作用:
    表明“在这里暂停等待另一个协程完成”,
    让出控制权,让事件循环(Event Loop)去运行其他任务。

  3. 并发调度:
    asyncio.gather() 用于并发运行多个协程,
    类似于 Promise.all()(在 JavaScript 中)。


执行流程图:

主任务 main()
 ├── fetch_data("任务A", 2)
 ├── fetch_data("任务B", 3)
 └── fetch_data("任务C", 1)

并发执行 → 等待最慢任务完成 → 汇总结果

注意:协程是并发而非并行(仍在单线程内切换)。
当某个任务 await 等待 IO 时,事件循环会自动切换到其他任务。


对比示例:同步 vs 异步

同步版本(串行执行)

import timedef fetch_data(name, delay):
    print(f"[{name}] 开始获取数据...")
    time.sleep(delay)
    print(f"[{name}] 数据获取完成,用时 {delay} 秒。")

start = time.time()
fetch_data("任务A", 2)
fetch_data("任务B", 3)
fetch_data("任务C", 1)
print("总耗时:", time.time() - start, "秒")

输出:

总耗时: 6 秒

异步版本:

总耗时: 3 秒

节省了一半时间。


应用场景:

异步协程在现代 Python 开发中广泛使用,尤其在:


总结:



特性

说明

async def

定义一个异步函数(协程)

await

暂停执行并等待另一个协程

asyncio.run()

启动事件循环

asyncio.gather()

并发执行多个任务

✅ 优点:

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境
相关推荐
高级工程师的进阶之路
LeetCode算法题-Path Sum III(Java实现)
深入JVM:(一)内存区域
顶级分布式开源项目,配上这款可视化工具,真香!
理解Android Matrix转换
首页
搜索
订单
购物车
我的