0

0

Python aiohttp.ClientSession 的生命周期管理

冷漠man

冷漠man

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

|

682人浏览过

|

来源于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免费学习笔记(深入)”;

Android开发指南中文pdf版
Android开发指南中文pdf版

Android开发指南中文pdf版,学习android的朋友可以参考下。应用程序基础Application Fundamentals 关键类 应用程序组件 激活组件:intent 关闭组件 manifest文件 Intent过滤器 Activity和任务 Affinity(吸引力)和新任务 加载模式 清理堆栈 启动任务 进程和线程 进程 线程 远程过程调用 线程安全方法 组件生命周期 Activity生命周期 调用父类 服务生命周期 广播接收器生命周期 进程与生命周期 用户界面User Interface

下载
  • 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 仍会继续运行,并在读取响应体时抛 ClientConnectionErrorCancelledError

这不是 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

28

2025.12.22

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

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

225

2026.02.06

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

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

192

2023.09.27

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

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

13

2026.02.03

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

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

329

2023.10.17

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

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

773

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

695

2023.08.10

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号