如何配置requests.post的blocksize参数解决文件上传速度慢问题
解决方案
requests 库默认没有暴露底层 http.client 的blocksize配置入口,默认8KB的发送块大小是导致大文件上传速度跑不满带宽的核心原因。你可以通过自定义HTTPAdapter的方式透传该参数,调大块大小即可解决速度问题。
实现步骤
- 自定义HTTP适配器类,重写连接池初始化逻辑,注入自定义块大小参数
- 将适配器挂载到requests会话上,所有通过该会话发送的请求都会使用你设置的块大小
- 按原有逻辑构造请求参数发送即可
完整可运行代码
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class CustomBlocksizeAdapter(HTTPAdapter): def __init__(self, blocksize: int = 1024 * 1024, **kwargs): self.blocksize = blocksize super().__init__(**kwargs) def init_poolmanager(self, connections: int, maxsize: int, block: bool = False, **pool_kwargs): pool_kwargs["blocksize"] = self.blocksize self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, **pool_kwargs ) # 初始化会话,挂载适配器 session = requests.Session() # 块大小建议设置为1MB~10MB区间,示例设置为2MB,可根据实际网络环境调整 upload_blocksize = 2 * 1024 * 1024 session.mount("http://", CustomBlocksizeAdapter(blocksize=upload_blocksize)) session.mount("https://", CustomBlocksizeAdapter(blocksize=upload_blocksize)) # 原有请求逻辑无需修改 file = {'file': open(file_name1, 'rb')} headers = {'Authorization': 'Bearer ' + app_key} response = session.post(url=push_chunk_url, files=file, headers=headers)
参数说明与注意事项
- 默认块大小仅为8192字节(8KB),过小的块会触发大量系统调用与网络协议开销,是上传速度仅能达到1MB/s左右的核心原因,调整后基本可以跑满可用带宽
- 块大小不建议设置超过10MB,过大的块会提升单次内存占用,也可能因为TCP分片机制反而降低传输效率
- 该方案仅适配Python 3.7及以上版本,低版本Python的http.client未实现blocksize参数,无法通过该方式调整
- 依赖要求:requests 2.0+、urllib3 1.25+,目前绝大多数Python环境的默认依赖版本都满足要求,无需额外升级
内容的提问来源于stack exchange,提问作者ZZ123
相关产品推荐
相关产品推荐

