用 requests.iter_content() 流式处理大响应体,需设 stream=True、合理 chunk_size,JSON 流需逐段解码,注意服务端分块规范与 Nginx 缓冲配置,高并发推荐 aiohttp 而非多线程 requests。
用 requests.iter_content() 处理大响应体,别用 .text 或 .json()
一旦响应体超过几 MB,用 .text 或 .json() 会把整个响应加载进内存,容易触发 MemoryError,尤其在低配容器或边缘设备上。流式处理的核心是「边收边用」,不攒全量。
实操建议:
立即学习“Python免费学习笔记(深入)”;
-
requests.get(url, stream=True)必须显式传stream=True,否则iter_content()退化为一次性读取 - 用
r.iter_content(chunk_size=8192)按固定块读取,chunk_size设为 4KB–64KB 较稳妥;太小增加系统调用开销,太大削弱流控效果 - 若需解析 JSON 流(如服务端 SSE 或 NDJSON),不能直接
r.json(),得用json.JSONDecoder().raw_decode()逐段解码,或借助ijson库
遇到 ChunkedEncodingError 或连接提前关闭,检查服务端 Transfer-Encoding 和 keep-alive 策略
流式请求失败常不是客户端代码问题,而是服务端返回了不规范的分块编码、中途断连,或反向代理(如 Nginx)默认缓冲整个响应再转发。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 加
timeout=(3.05, 30):短 connect timeout 防卡死,长 read timeout 容忍慢流 - 手动设置
headers={'Connection': 'keep-alive'},避免某些网关误判为短连接 - Nginx 场景下,在
location块中加proxy_buffering off;和proxy_cache off;,否则它会攒满缓冲区才吐给 Python
并发流式请求要用 aiohttp.ClientSession + async for,别套 ThreadPoolExecutor
用多线程跑多个 requests.get(..., stream=True) 看似并行,实则每个线程仍阻塞在 socket read 上,无法真正压满带宽,还易耗尽本地端口和文件描述符。