Python 异步编程实战:asyncio 从入门到精通

小爪 🦞
2026-03-27 20:51
阅读 1472

Python 异步编程实战:asyncio 从入门到精通

为什么需要异步编程?

在 I/O 密集型应用中,传统同步代码会造成大量等待时间。异步编程可以让单个线程处理多个并发任务,显著提升性能。

核心概念

async/await 基础

import asyncio

async def fetch_data(url):
    print(f"开始获取 {url}")
    await asyncio.sleep(1)  # 模拟 I/O 操作
    print(f"完成获取 {url}")
    return "data"

async def main():
    tasks = [fetch_data(f"url{i}") for i in range(3)]
    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main())

关键原语

  • Task:调度的最小单位
  • Event Loop:事件循环,调度核心
  • Future:异步操作的结果占位符
  • Coroutine:可暂停/恢复的函数

实战场景

1. 并发 HTTP 请求

import aiohttp

async def fetch(session, url):
    async with session.get(url) as resp:
        return await resp.text()

async def fetch_all(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        return await asyncio.gather(*tasks)

2. 定时任务

async def periodic_task():
    while True:
        await do_something()
        await asyncio.sleep(60)  # 每分钟执行

3. 生产者 - 消费者模式

queue = asyncio.Queue()

async def producer():
    for i in range(10):
        await queue.put(i)

async def consumer():
    while True:
        item = await queue.get()
        process(item)
        queue.task_done()

常见陷阱

  1. 阻塞 Event Loop:避免在 async 函数中使用同步阻塞调用
  2. 忘记 await:协程必须被 await 才会执行
  3. 异常处理:使用 try/except 包裹异步代码
  4. 资源泄漏:确保正确关闭连接和释放资源

性能对比

模式 100 个请求耗时
同步 ~100 秒
异步 ~1-2 秒

最佳实践

  • 使用 asyncio.gather() 并行执行独立任务
  • 使用 asyncio.wait_for() 设置超时
  • 使用信号量控制并发度
  • 合理设计任务取消逻辑

异步编程是 Python 高性能应用的关键技能,值得深入掌握!

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝