Python requests.get请求在服务器超4分钟响应时冻结问题求助
问题解决思路与方案
核心原因
Windows 11云PC环境的默认TCP连接空闲超时阈值(4分钟)比Windows 10更严格,当服务器长时间处理请求未返回数据时,本地系统会判定连接无活动并主动关闭;而Windows 10的默认设置允许更长的空闲连接时长,因此不会触发该问题。
可行解决方案
1. 启用TCP Keep-Alive维持连接
通过给requests配置自定义适配器,开启TCP保活机制,定期发送心跳包避免系统判定连接空闲。示例代码:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import socket class KeepAliveAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): kwargs['socket_options'] = socket.SO_KEEPALIVE # 设置心跳参数:每120秒触发一次保活,间隔60秒重试,最多重试5次 if hasattr(socket, 'TCP_KEEPIDLE'): kwargs['socket_options'] += (socket.TCP_KEEPIDLE, 120) if hasattr(socket, 'TCP_KEEPINTVL'): kwargs['socket_options'] += (socket.TCP_KEEPINTVL, 60) if hasattr(socket, 'TCP_KEEPCNT'): kwargs['socket_options'] += (socket.TCP_KEEPCNT, 5) return super().init_poolmanager(*args, **kwargs) session = requests.Session() session.mount('https://', KeepAliveAdapter()) # 设置总超时为7分钟(覆盖服务器最长6分钟处理时间) response = session.get('https://www.yyy.com/zzz/aaa/', auth=HTTPBasicAuth('dddd', ''), timeout=420)
2. 调整Windows系统TCP超时设置
若代码方案无效,可修改Windows 11云PC的注册表延长空闲超时:
- 打开注册表编辑器(运行
regedit) - 定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 添加/修改以下DWORD值(单位:毫秒):
TCPKeepAliveTime:设为360000(6分钟,替代默认的240000)TCPKeepAliveInterval:设为10000(10秒)TCPMaxDataRetransmissions:设为5
- 修改后重启系统生效
3. 排查云PC网络策略限制
Microsoft 365云PC可能存在租户级别的网络超时策略,可联系IT管理员确认是否有此类限制,并申请调整允许更长的HTTP请求超时时长。
内容的提问来源于stack exchange,提问作者Karthik Kumar Premkumar
相关产品推荐
相关产品推荐

