讲师中心 微信公众号
AI工具推荐 视频效率加速

Python aiohttp.ClientSession 的生命周期管理

胖瑶小哥_5977

胖瑶小哥_5977

发布时间:2026-02-21 18:35:03

|

762人浏览过

|

来源于php中文网

原创

ClientSession 必须显式关闭,因其持有连接池、DNS缓存等异步资源,GC不会调用close导致文件描述符泄漏;须用async with或显式await session.close(),且不可跨event loop复用。

python aiohttp.clientsession 的生命周期管理

ClientSession 必须显式关闭,不能靠 GC 回收

aiohttp 的 ClientSession 不是普通对象,它内部持有连接池、DNS 缓存、SSL 上下文等异步资源。Python 的垃圾回收(GC)不会主动调用其 __aexit__ 或 close(),导致 TCP 连接不释放、文件描述符泄漏、后续请求卡死或报 RuntimeError: Session is closed。

常见错误现象:脚本跑几次就报 OSError: [Errno 24] Too many open files;或者在 asyncio.run() 结束后还看到未完成的连接日志。

  • 必须用 async with ClientSession() as session: 包裹使用范围
  • 若需跨多个协程复用 session(如全局 session),务必在程序退出前显式 await session.close()
  • 不要在函数里返回未关闭的 session 给调用方——责任边界要清晰

复用 session 是必须的,但不能跨 event loop

一个 ClientSession 实例绑定到创建它的 asyncio event loop。如果在不同 loop(比如新线程里新建 loop、或 pytest 中反复启停 loop)中复用旧 session,会直接抛 RuntimeError: Session is closed 或静默失败。

使用场景:Web 服务(如 FastAPI)中常把 session 当作依赖注入;命令行工具中想避免每次请求都新建 session。

立即学习“Python免费学习笔记(深入)”;

Browser Session Manager
Browser Session Manager

使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能

下载
  • FastAPI 等框架推荐用 lifespan hook,在 startup 时创建 session,shutdown 时 close
  • 测试时别在 setUp 里建 session,改用 fixture + yield + await session.close()
  • 绝对不要把 session 存在模块级变量里然后跨 test case 复用

timeout 和 connector 参数影响连接行为远超预期

ClientSession 的 timeout 控制的是单次请求生命周期,而 connector(如 TCPConnector)控制的是底层连接池策略。两者配合不当会导致超时逻辑混乱、连接复用失效、甚至 DNS 查询被缓存数分钟。

典型问题:设置了 timeout=5,但某个请求卡住 60 秒才报错;或并发请求量大时大量新建连接,触发服务器限流。

  • timeout 应设为 aiohttp.ClientTimeout(total=30, connect=5, sock_read=10),避免只设 total 导致 DNS 解析失败也计入超时
  • TCPConnector(limit=100, limit_per_host=30, ttl_dns_cache=300) —— 默认 limit=100 看似够用,但 limit_per_host=0(即不限)才是旧版默认值,升级后容易突然变慢
  • DNS 缓存默认 10 分钟,若后端做滚动发布,建议显式设 ttl_dns_cache=60

session 关闭后仍可能有 pending request 报错

关闭 session 并不等于立刻终止所有进行中的请求。如果在 await session.close() 前已有 await session.get(...) 发出但尚未收到响应,这些 task 仍会继续运行,并在读取响应体时抛 ClientConnectionError 或 CancelledError。

这不是 bug,而是 asyncio 的正常调度行为:close 只是拒绝新请求、清理空闲连接,不强制 cancel 正在传输的 request。

  • 关键点:关闭 session 前,确保所有已发请求已完成或已被 cancel
  • 安全做法是在 shutdown 逻辑里用 asyncio.shield() 包裹关键请求,或用 asyncio.wait_for(task, timeout=...) 控制等待时间
  • 别依赖 “关 session 就万事大吉”——网络 IO 的不确定性始终存在

session 生命周期最麻烦的地方不在怎么开,而在怎么确认它真关了:连接池清空、DNS 缓存失效、所有 pending task 归零。这些状态没法靠 print 看出来,得靠 lsof -i | grep python 或 asyncio debug 模式验证。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

119

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

554

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

656

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

539

2026.06.16

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3060

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn