Python 异步编程是现代高效开发的重要技能,尤其在处理 I/O 密集型任务(如网络请求、文件操作)时表现出色。本文将从基础概念入手,逐步深入到高级实践,帮助读者掌握 asyncio 和 aiohttp 等核心工具,最终实现优雅的异步代码设计。无论您是初学者还是有一定经验的开发者,都能从中受益。
1. 什么是异步编程?
- 同步 vs 异步
# 同步代码示例
import time
def 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.
# 异步
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 基础用法
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 task1
await task2
asyncio.run(main())
# asyncio.create_task() 创建并发任务。
# syncio.gather():并行运行多个协程。
# asyncio.wait():更灵活的任务管理。
# aiohttp:异步 HTTP 请求
import aiohttp
import asyncio
async 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())