aiohttp 简介

aiohttp 是一个基于 Python 的异步 HTTP 客户端/服务器框架,构建于 asyncio 之上。它支持高性能的异步网络操作,适用于 Web 服务、爬虫、API 调用等场景。

核心功能

  • HTTP 客户端:支持异步发送 HTTP 请求,处理响应。
  • HTTP 服务器:提供异步 Web 服务器功能,支持路由、中间件等。
  • WebSocket:支持客户端和服务端的 WebSocket 通信。
  • Session 管理:通过 ClientSession 复用连接,提升性能。

安装

通过 pip 安装:

pip install aiohttp


异步 HTTP 客户端示例

以下是一个简单的异步 HTTP GET 请求示例:

import aiohttp
import asyncio

async def fetch_data(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    url = "https://httpbin.org/get"
    data = await fetch_data(url)
    print(data)

asyncio.run(main())

关键点

  • 使用 ClientSession 管理 HTTP 连接。
  • response.text() 异步获取响应内容。

异步 HTTP 服务器示例

创建一个简单的 Web 服务器:

from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, aiohttp!")

app = web.Application()
app.add_routes([web.get("/", handle)])

if __name__ == "__main__":
    web.run_app(app, port=8080)

路由与响应

  • 通过 web.get 定义路由。
  • web.Response 生成 HTTP 响应。

WebSocket 通信示例

客户端

async def websocket_client():
    async with aiohttp.ClientSession() as session:
        async with session.ws_connect("ws://echo.websocket.org") as ws:
            await ws.send_str("Hello, WebSocket!")
            async for msg in ws:
                if msg.type == aiohttp.WSMsgType.TEXT:
                    print(f"Received: {msg.data}")

服务端

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            await ws.send_str(f"Echo: {msg.data}")

app.add_routes([web.get("/ws", websocket_handler)])


性能优化建议

  • 复用 ClientSession:避免频繁创建/关闭会话,减少开销。
  • 连接池限制:通过 connector 参数调整连接池大小。
  • 超时设置:使用 timeout 参数避免请求阻塞。

示例:

timeout = aiohttp.ClientTimeout(total=10)
connector = aiohttp.TCPConnector(limit=20)
async with aiohttp.ClientSession(timeout=timeout, connector=connector) as session:
    ...


常见问题

  1. 协程未执行:确保调用 asyncio.run() 或事件循环启动。
  2. 连接泄露:检查是否未关闭 ClientSession 或响应对象。
  3. SSL 错误:添加 ssl=False 参数(仅测试环境)。

通过上述方法和示例,可以快速上手 aiohttp 的异步 HTTP 和 WebSocket 开发。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐