Python进阶实例 第49例:使用 async / await 实现异步协程

  • 时间:2025-10-20 21:53 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:在第48例中,我们学习了基于生成器的“原始协程”模型(使用 yield 与 send())。从 Python 3.5 开始,官方引入了 async / await 语法,使协程编程更直观、更易读、更安全。问题描述:模拟一个异步网络请求场景:通过 async 定义异步函数;使用 await 模拟网络 IO;同时运行多个任务,展示协程的并发特性。代码示例:imp

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


问题描述:

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

  • 通过 async 定义异步函数;

  • 使用 await 模拟网络 IO;

  • 同时运行多个任务,展示协程的并发特性。


代码示例:

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 开发中广泛使用,尤其在:

  • 网络编程(HTTP 请求、WebSocket)

  • 爬虫框架(如 aiohttp、Scrapy)

  • 高并发 API 服务(如 FastAPI、Sanic)

  • 实时系统(消息队列、聊天系统)


总结:



特性

说明

async def

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

await

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

asyncio.run()

启动事件循环

asyncio.gather()

并发执行多个任务

✅ 优点:

  • 高效、节省线程资源;

  • 更容易控制任务间的并发;

  • 是现代 Python 异步编程的核心。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Ubuntu 25.04 + RTX 2080(8GB)用 vLLM 部署 Qwen3:8B(2025-10-20 23:52)
【系统环境|】程序员笔记:LINUX安装NVIDIA驱动程序(2025-10-20 23:51)
【系统环境|】ollama 部署和配置(2025-10-20 23:50)
【系统环境|】docker环境运行GPU算法基础环境搭建(2025-10-20 23:50)
【系统环境|】60块钱矿卡p106重新上岗玩大模型(2025-10-20 23:49)
【系统环境|】Ubuntu 安装 NVIDIA L20 显卡驱动(2025-10-20 23:48)
【系统环境|】Ubuntu 22.04 Tesla V100s显卡驱动,CUDA,cuDNN,MiniCONDA3 环境的安装(2025-10-20 23:47)
【系统环境|】显卡驱动安装后CUDA不可用?90%的人都踩过这3个坑(2025-10-20 23:46)
【系统环境|】一夜回到解放前——掀起“NVDLA”的盖头来(Nvidia刚发布的NVDLA是何方神圣?)(2025-10-20 23:45)
【系统环境|】一键提取歌曲伴奏和人声分轨,最强伴奏与人声分离工具(2025-10-20 23:44)
手机二维码手机访问领取大礼包
返回顶部