当前位置: 首页 > news >正文

aiohttp模块如何使用

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:...


常见问题

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

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

http://www.dtcms.com/a/354288.html

相关文章:

  • 开发避坑指南(39):Java List全null元素引发的空判断无效处理方案
  • 用LightRAG打造智能问答系统:知识图谱与RAG的融合应用实践
  • 如何在升级到S/4HANA后关闭SAP旧系统?
  • 3-4〔OSCP ◈ 研记〕❘ WEB应用攻击▸Burp Suite工具
  • MySQL中的InnoDB
  • pikachu-xss通关(1-8)
  • qt5+mingw64+opencv4.5.2搭建调试环境
  • FOC算法第二节 克拉克变换
  • mybatis-plus实现苍穹外卖项目-分类操作,不定期更新-day2
  • Hadoop(五)
  • AI、人工智能基础: 模型剪枝的概念与实践(PyTorch版)
  • uvloop深度实践:从原理到高性能异步应用实战
  • 死锁产生的条件是什么? 如何进行死锁诊断?
  • 本地部署DeepSeek大模型的基本方法
  • 自定义命令行补全机制的核心工具之compgen
  • web服务组件
  • MII的原理
  • 软件设计师备考-(三)操作系统基本原理
  • leetcode28. 找出字符串中第一个匹配项的下标
  • VR党建工作站-红色教育基地
  • 路由基础(三):静态路由、动态路由、默认路由
  • Linux系统 -- 线程(pthread)核心知识整理
  • 【golang长途旅行第33站】常量------补充知识点
  • 学习游戏制作记录(数据加密以及主菜单和画面优化)8.27
  • 运算电源抑制比(PSRR)测量及设计注意事项
  • 去哪里学AI?2025年AI培训机构推荐!
  • 部署k8s-efk日志收集服务(小白的“升级打怪”成长之路)
  • 数据库:缓冲池和磁盘I/O
  • 让组件“活”起来:使用 `useState` Hook 管理组件状态
  • 【苍穹外卖项目】Day12