Python 异步编程是现代高效开发的重要技能,尤其在处理 I/O 密集型任务(如网络请求、文件操作)时表现出色。本文将从基础概念入手,逐步深入到高级实践,帮助读者掌握 asyncio 和 aiohttp 等核心工具,最终实现优雅的异步代码设计。无论您是初学者还是有一定经验的开发者,都能从中受益。
1. 什么是异步编程?
- 同步 vs 异步
python"># 同步代码示例
import timedef task(name):print(f"Task {name} started.")time.sleep(2) # 模拟耗时操作print(f"Task {name} finished.")task("A")
task("B")
输出:Task A started.
Task A finished.
Task B started.
Task B finished.
python"># 异步
async def say_hello():print("Hello")await asyncio.sleep(1) # 模拟异步操作print("World")# 运行协程
import asyncio
asyncio.run(say_hello())
2. Python 异步编程的核心概念
- 协程 (Coroutine)
定义:协程是一种可以暂停和恢复执行的函数。
使用 async def 定义协程函数。 - 事件循环是异步编程的核心,负责调度协程。
示例:如何使用 asyncio.run() 启动事件循环。 - await 关键字
用于等待一个异步操作完成。
注意事项:只能在 async 函数中使用。
3. asyncio 基础用法
python">async def task_a():print("Task A started")await asyncio.sleep(2)print("Task A finished")async def task_b():print("Task B started")await asyncio.sleep(1)print("Task B finished")async def main():task1 = asyncio.create_task(task_a())task2 = asyncio.create_task(task_b())await task1await task2asyncio.run(main())
# asyncio.create_task() 创建并发任务。
# syncio.gather():并行运行多个协程。
# asyncio.wait():更灵活的任务管理。
python"># aiohttp:异步 HTTP 请求
import aiohttp
import asyncioasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():urls = ["https://example.com","https://httpbin.org/get",]async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]results = await asyncio.gather(*tasks)for i, result in enumerate(results):print(f"Result from URL {i+1}: {len(result)} bytes")asyncio.run(main())