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 控制最大并发,避免对端限流