Python进阶教程 第 8 章:异步编程 (async / await 与 asyncio)

  • 时间:2025-11-23 20:21 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:点击头像,进入个人中心,查看文章合集,还有更多Python相关的精彩教程等着你!8.1 引言在第 7 章中我们学习了 多线程,但由于 GIL 限制,它更适合 I/O 密集型任务。Python 提供了另一种并发模型:异步编程 (Asynchronous Programming)。通过 事件循环 (Event Loop) 调度任务使用 async / await 关键字避免了线程切换的开销,适合 网络

点击头像,进入个人中心,查看文章合集,还有更多Python相关的精彩教程等着你!

8.1 引言

在第 7 章中我们学习了 多线程,但由于 GIL 限制,它更适合 I/O 密集型任务

Python 提供了另一种并发模型:异步编程 (Asynchronous Programming)

  • 通过 事件循环 (Event Loop) 调度任务
  • 使用 async / await 关键字
  • 避免了线程切换的开销,适合 网络编程、爬虫、异步 I/O

8.2 协程基础

8.2.1 定义协程函数

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

示例:

import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)  # 异步等待
    print("World")

asyncio.run(say_hello())

✅ 输出结果:

Hello
World   (延迟 1 秒)

8.2.2 同时运行多个协程

asyncio.gather 可以并发运行多个协程。

示例:

import asyncio

async def worker(name, delay):
    print(f"任务 {name} 开始")
    await asyncio.sleep(delay)
    print(f"任务 {name} 完成")

async def main():
    await asyncio.gather(
        worker("A", 2),
        worker("B", 1),
        worker("C", 3),
    )

asyncio.run(main())

✅ 输出结果(并发执行):

任务 A 开始
任务 B 开始
任务 C 开始
任务 B 完成
任务 A 完成
任务 C 完成

8.3 asyncio 的任务管理

8.3.1 创建任务

asyncio.create_task 可显式创建任务,使多个协程并发运行。

示例:

import asyncio

async def task(name, delay):
    await asyncio.sleep(delay)
    print(f"任务 {name} 完成")

async def main():
    t1 = asyncio.create_task(task("X", 2))
    t2 = asyncio.create_task(task("Y", 1))

    print("等待任务完成...")
    await t1
    await t2

asyncio.run(main())

✅ 输出结果:

等待任务完成...
任务 Y 完成
任务 X 完成

8.4 超时控制

示例:

import asyncio

async def slow_task():
    await asyncio.sleep(5)
    return "完成"

async def main():
    try:
        result = await asyncio.wait_for(slow_task(), timeout=2)
        print(result)
    except asyncio.TimeoutError:
        print("任务超时!")

asyncio.run(main())

✅ 输出结果:

任务超时!

8.5 异步队列

asyncio.Queue 用于协程间的任务通信。

示例:

import asyncio

async def producer(queue):
    for i in range(5):
        await queue.put(i)
        print(f"生产: {i}")
        await asyncio.sleep(1)

async def consumer(queue):
    while True:
        item = await queue.get()
        print(f"消费: {item}")
        queue.task_done()

async def main():
    queue = asyncio.Queue()
    producer_task = asyncio.create_task(producer(queue))
    consumer_task = asyncio.create_task(consumer(queue))

    await producer_task
    await queue.join()
    consumer_task.cancel()

asyncio.run(main())

✅ 输出结果(生产者和消费者并发运行):

生产: 0
消费: 0
生产: 1
消费: 1
...

8.6 异步上下文管理器

异步编程中也可以使用 async with 来管理资源。

示例:

import asyncio

class AsyncContext:
    async def __aenter__(self):
        print("进入异步上下文")
        return "资源对象"

    async def __aexit__(self, exc_type, exc, tb):
        print("退出异步上下文")

async def main():
    async with AsyncContext() as res:
        print("使用:", res)

asyncio.run(main())

✅ 输出结果:

进入异步上下文
使用: 资源对象
退出异步上下文

8.7 小结

  • 协程:async def + await
  • 并发运行:asyncio.gather、create_task
  • 超时控制:asyncio.wait_for
  • 异步队列:asyncio.Queue 实现生产者-消费者模型
  • async with:管理异步资源

异步编程在 网络编程、爬虫、高并发服务 中超级高效。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Svelte框架结合SpreadJS实现纯前端类Excel在线填报(2025-11-23 22:34)
【系统环境|】在Three.js中使用HDRI贴图作为3D背景和光源(2025-11-23 22:34)
【系统环境|】看完这一篇学会MyBatis就够了(2025-11-23 22:33)
【系统环境|】linux ps命令详解(2025-11-23 22:33)
【系统环境|】Linux日常小知识EFK(2025-11-23 22:32)
【系统环境|】Linux系统的ps命令和top命令介绍(2025-11-23 22:32)
【系统环境|】跟LaoLiu老刘记英语单词——————刘怀勋(2025-11-23 22:31)
【系统环境|】电容的滤波和退耦,真的理解了吗?(2025-11-23 22:31)
【系统环境|】共射放大电路的低频截频计算方法验证(2025-11-23 22:30)
【系统环境|】“谐音梗英文名,看看你的是什么?”(2025-11-23 22:30)
手机二维码手机访问领取大礼包
返回顶部