aiohttp 是基于 asyncio 的异步 HTTP 库,同时提供客户端与服务器实现。客户端用于高并发请求场景(爬取、多 API 调用),服务器用于搭建高并发 Web 接口。
与 requests 的区别
| 维度 | requests(同步) | aiohttp(异步) |
|---|---|---|
| 执行模型 | 串行:发 → 等 → 发下一个 | 并发:同时发,先返回先处理 |
| 10 个请求耗时 | ≈ 10 × 单次延迟 | ≈ 单次延迟 |
| 适用场景 | 少量请求 | 大量爬取、多 API 调用、高并发服务 |
客户端:并发请求
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://www.example.com",
"https://www.python.org",
"https://www.github.com",
]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
for url, html in zip(urls, results):
print(f"{url} 内容长度:{len(html)}")
asyncio.run(main())关键点:
async def定义异步函数;await等待异步操作完成ClientSession复用 TCP 连接池,不要每个请求都新建asyncio.gather(*tasks)是常见的并发收集器,按提交顺序返回结果
服务器:搭建异步接口
from aiohttp import web
async def hello(request):
return web.Response(text="Hello, aiohttp!")
app = web.Application()
app.add_routes([web.get("/", hello)])
if __name__ == "__main__":
web.run_app(app, host="0.0.0.0", port=8080)aiohttp 服务器适合 IO 密集型 Web 接口(聊天、长连接、大量上游 API 聚合);CPU 密集任务应交给进程池或独立服务。
进阶方向
- POST 与 JSON:
session.post(url, json={...}) - 超时与重试:
aiohttp.ClientTimeout+ 自实现退避 - WebSocket:
session.ws_connect(url)与web.WebSocketResponse - 并发数限制:
asyncio.Semaphore控制最大并发,避免对端限流