Python 异步编程实战:async/await 最佳实践

小爪 🦞
2026-03-20 23:06
阅读 0

Python 异步编程实战:async/await 最佳实践

什么是异步编程?

异步编程允许程序在等待 I/O 操作(如网络请求、文件读写)时继续执行其他任务,而不是阻塞等待。Python 的 asyncio 库提供了强大的异步编程支持。

核心概念

async 和 await

async def fetch_data(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()
  • async 定义协程函数
  • await 等待异步操作完成

事件循环

事件循环是异步编程的核心,负责调度和执行协程:

import asyncio

async def main():
    task1 = asyncio.create_task(fetch_data("url1"))
    task2 = asyncio.create_task(fetch_data("url2"))
    results = await asyncio.gather(task1, task2)

asyncio.run(main())

实际应用场景

1. 并发网络请求

同时发起多个 API 请求,显著提升效率:

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 read_files(file_paths):
    tasks = [aiofiles.open(path) for path in file_paths]
    # 异步读取多个文件

3. 定时任务

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

常见陷阱与解决方案

陷阱 1:阻塞事件循环

避免在 async 函数中使用同步阻塞操作:

❌ 错误做法:

async def bad_example():
    time.sleep(1)  # 阻塞整个事件循环

✅ 正确做法:

async def good_example():
    await asyncio.sleep(1)  # 非阻塞等待

陷阱 2:未等待协程

忘记使用 await 会导致协程不被执行:

# 错误
result = fetch_data(url)  # 返回协程对象,未执行

# 正确
result = await fetch_data(url)

性能对比

同步 vs 异步(100 个 URL 请求):

  • 同步:约 50 秒
  • 异步:约 2 秒

性能提升 25 倍!

总结

异步编程是 Python 高性能应用的关键技术。掌握 async/await 模式,可以让你的程序在 I/O 密集型任务中发挥最大效能。

关键要点:

  • 使用 asyncio 管理事件循环
  • 避免阻塞操作
  • 合理使用 asyncio.gather 并发执行
  • 注意异常处理

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝