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 asyncioasync 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 webasync 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:...
常見問題
- 協程未執行:確保調用
asyncio.run()
或事件循環啟動。 - 連接泄露:檢查是否未關閉
ClientSession
或響應對象。 - SSL 錯誤:添加
ssl=False
參數(僅測試環境)。
通過上述方法和示例,可以快速上手 aiohttp 的異步 HTTP 和 WebSocket 開發。