使用Pyrogram处理多群组时触发TCPTransport已关闭OSError问题求助
Pyrogram多群组场景下TCP连接关闭错误原因及解决方向
错误信息
raise e from None File "/home/tabssit2/virtualenv/2baT/3.8/lib/python3.8/site-packages/pyrogram/session/session.py", line 389, in invoke return await self.send(query, timeout=timeout) File "/home/tabssit2/virtualenv/2baT/3.8/lib/python3.8/site-packages/pyrogram/session/session.py", line 340, in send raise e File "/home/tabssit2/virtualenv/2baT/3.8/lib/python3.8/site-packages/pyrogram/session/session.py", line 337, in send await self.connection.send(payload) File "/home/tabssit2/virtualenv/2baT/3.8/lib/python3.8/site-packages/pyrogram/connection/connection.py", line 69, in send await self.protocol.send(data) File "/home/tabssit2/virtualenv/2baT/3.8/lib/python3.8/site-packages/pyrogram/connection/transport/tcp/tcp_abridged.py", line 38, in send await super().send( File "/home/tabssit2/virtualenv/2baT/3.8/lib/python3.8/site-packages/pyrogram/connection/transport/tcp/tcp.py", line 104, in send raise OSError(e) OSError: unable to perform operation on <TCPTransport closed=True reading=False 0x55e969ef2de0>; the handler is closed [10] Retrying "updates.GetState" due to: unable to perform operation on <TCPTransport closed=True reading False 0x55e969ef2de0>; the handler is closed
可能原因
- TCP连接资源过载:大量群组的更新推送会让单个Pyrogram会话的TCP长连接负载过高,触发Telegram服务器的连接阈值限制,或者主机文件描述符耗尽,导致连接被强制关闭。
- 事件循环阻塞:handler中存在未正确使用
await的同步阻塞代码,占用事件循环导致无法及时处理Telegram的心跳包,服务器判定连接超时并关闭。 - Pyrogram版本缺陷:旧版本Pyrogram在高并发更新场景下存在连接管理bug,无法妥善处理多群组的连接维护。
- 主机网络限制:主机防火墙、NAT规则或服务商策略限制了长连接数量,群组增加后超出限制导致连接被切断。
解决方向
- 调整连接配置:
- 创建
Client时设置connection_retries=15(提高重试次数)、timeout=30(延长超时时间),增强连接容错性。 - 改用HTTP连接模式:
connection_type=pyrogram.ConnectionType.HTTP,降低TCP长连接的压力。
- 创建
- 优化handler逻辑:
- 确保所有异步操作都添加
await,避免同步代码阻塞事件循环。 - 使用
asyncio.Semaphore限制并发处理的任务数量,示例代码:from asyncio import Semaphore sem = Semaphore(10) # 限制同时处理10个任务 @app.on_message() async def handler(client, message): async with sem: # 处理逻辑 pass
- 确保所有异步操作都添加
- 提升系统资源限制:
- 查看当前文件描述符限制:
ulimit -n,若低于65535,修改/etc/security/limits.conf添加:soft nofile 65535 hard nofile 65535 - 重启系统或重新登录后生效。
- 查看当前文件描述符限制:
- 升级依赖版本:
- 执行
pip install --upgrade pyrogram tgcrypto,更新到最新版修复已知bug。
- 执行
内容的提问来源于stack exchange,提问作者Erfan
相关产品推荐
相关产品推荐

