Python高级应用系列(六):异步编程——asyncio的精髓与实践
标签:Python | asyncio | 异步编程 | 高并发 | 性能优化字数:约 4500 字建议阅读时间:14 分钟前言在 Python 的世界里,异步编程(Async/Await)是处理 I/O 密集型任务的不二之选。无论是爬虫、API 调用、数据库查询还是 Web 服务,asyncio 都能让代码在等待 I/O 时切换到其他任务,从而大幅提升吞吐量。然而,很多人对 asyncio 存在误解:把它当成"多线程的替代品",或者写出的代码看似 async 实则串行。本文将系统地讲解 asyncio 的核心概念、正确的异步写法,以及生产环境中的最佳实践。一、同步 vs 异步:到底有什么区别?1.1 同步代码的执行模型import time def fetch_user(): time.sleep(1) # 阻塞1秒 return "Alice" def fetch_order(): time.sleep(1) # 阻塞1秒 return "订单123" start = time.time() user = fetch_user() order = fetch_order() print(f"总耗时: {time.time() - start:.2f}s") # 2秒两个函数各自阻塞1秒,串行执行,总耗时2秒。1.2 异步代码的执行模型import asyncio import time async def fetch_user(): await asyncio.sleep(1) # 非阻塞挂起 return "Alice" async def fetch_order(): await asyncio.sleep(1) return "订单123" async def main(): start = time.time() # 并发执行两个协程 user, order = await asyncio.gather( fetch_user(), fetch_order() ) print(f"总耗时: {time.time() - start:.2f}s") asyncio.run(main()) # 0.99秒两个协程并发运行,总耗时约1秒。关键在于await asyncio.sleep(1)——它让出控制权,让事件循环调度其他可运行的任务。二、async/await 基础2.1 定义协程函数# 协程函数:用 async def 声明 async def hello(): return "Hello, Async!" # 调用方式一:asyncio.run(推荐用于脚本) result = asyncio.run(hello()) # 调用方式二:在另一个协程中用 await async def main(): result = await hello() print(result) asyncio.run(main())重要:async def定义的是协程函数,调用它返回的是一个协程对象——必须用await或asyncio.run()驱动它,否则不会执行。2.2 await 到底做了什么async def step1(): print("步骤1开始") await asyncio.sleep(0.5) print("步骤1结束") async def step2(): print("步骤2开始") await asyncio.sleep(0.3) print("步骤2结束") async def main(): # 顺序执行 await step1() await