MacOS(M2)下Python请求https://api.telegram.org/速度异常缓慢排查
问题:MacBook Pro M2上Python requests请求https://api.telegram.org/耗时异常漫长
环境信息
- macOS系统版本:
% sw_vers ProductName: macOS ProductVersion: 13.3.1 ProductVersionExtra: (a) BuildVersion: 22E772610a
- Python版本:
Python 3.11.3
测试脚本
requests测试脚本 (requests_test.py)
import time import requests start = time.time() response = requests.get('https://api.telegram.org/') print('Time:', time.time() - start)
httpx测试脚本 (httpx_test.py)
import time import httpx start = time.time() response = httpx.get('https://api.telegram.org/') print('Time:', time.time() - start)
测试结果
- 主机本地环境:
- requests脚本耗时:约151.99秒
- httpx脚本耗时:约5.84秒
- Docker容器内:
- requests脚本耗时:约1.32秒
- httpx脚本耗时:约1.04秒
- curl命令请求耗时:约1.92秒
核心现象:仅针对api.telegram.org域名出现该问题,更换Python版本后无改善。
排查方案与解决办法
1. 强制指定DNS服务器
requests依赖的urllib3在部分macOS环境下对境外域名的DNS解析存在延迟,手动指定公共DNS可解决:
import time import requests import socket from urllib3.util.connection import create_connection def use_custom_dns(dns_servers): def patched_conn(address, *args, **kwargs): host, port = address for dns in dns_servers: try: ip = socket.gethostbyname_ex(host)[2][0] return create_connection((ip, port), *args, **kwargs) except socket.gaierror: continue raise socket.gaierror("DNS resolution failed") socket.create_connection = patched_conn # 配置谷歌公共DNS use_custom_dns(['8.8.8.8', '8.8.4.4']) start = time.time() resp = requests.get('https://api.telegram.org/') print('耗时:', time.time() - start)
2. 调整SSL/TLS配置
requests默认SSL后端与httpx、curl存在差异,尝试强制使用系统SSL库:
import time import requests import ssl ssl_ctx = ssl.create_default_context() ssl_ctx.set_default_verify_paths() start = time.time() resp = requests.get('https://api.telegram.org/', verify=ssl_ctx) print('耗时:', time.time() - start)
注意:测试阶段可临时关闭证书验证(verify=False)确认是否为证书问题,但生产环境禁止使用。
3. 禁用代理
macOS系统代理可能被requests异常加载,导致走无效代理路径,明确禁用代理:
import time import requests start = time.time() resp = requests.get('https://api.telegram.org/', proxies={'http': None, 'https': None}) print('耗时:', time.time() - start)
4. 更新依赖库
requests依赖的urllib3旧版本可能存在连接池或握手bug,执行以下命令更新:
pip install --upgrade urllib3 requests
内容的提问来源于stack exchange,提问作者qmessagebox
相关产品推荐
相关产品推荐

