Python调用Google Cloud Storage下载文件出现Request exception报错如何解决?
问题根因
- 官方google-cloud-storage库默认的读取超时阈值较低,网络稍有波动就会触发
ReadTimeout错误 - 未配置请求重试逻辑,偶发的网络抖动、GCS服务端临时限流都会直接导致请求失败
- 长闲置的连接失效后没有自动重建,复用旧连接时也会触发端口相关的连接异常
优化后代码
import requests from google.cloud import storage from google.api_core.retry import Retry class GCP_Storage_Resource: def __init__(self): BUCKET_NAME = 'bucket name' # 初始化客户端时配置标准API端点 storage_client = storage.Client.from_service_account_json( 'Resources/Token/storage_private_key.json', client_options={"api_endpoint": "https://storage.googleapis.com"} ) self.bucket = storage_client.get_bucket(BUCKET_NAME) # 配置统一重试策略:可重试异常最多重试3次,指数退避等待 self.retry_strategy = Retry( total=3, backoff_factor=1, retry_on_exception=lambda e: isinstance(e, ( requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError, )) ) def get_resource_file(self, source: str, location: str) -> None: blob = self.bucket.blob(source) # 下载时指定超时和重试策略 blob.download_to_filename( location, timeout=60, # 读取超时设为60秒,可根据文件大小上调 retry=self.retry_strategy ) if __name__ == "__main__": gcp_storage_resource = GCP_Storage_Resource() gcp_storage_resource.get_resource_file(source='...', location='..')
优化说明
- 拉长超时时间:将单次请求的读取超时调整为60秒,避免正常传输过程中被强制断开
- 新增自动重试:针对ReadTimeout、连接错误等偶发可恢复异常配置指数退避重试,不需要手动干预就能解决绝大多数偶发错误
- 连接复用:统一复用同一个客户端实例,避免反复初始化客户端导致频繁创建销毁连接占用443端口,减少端口冲突概率
额外排查建议
如果调整后仍然频繁出现超时,可优先检查本地网络环境:
- 是否存在代理、防火墙限制443端口出站连接
- 本地网络是否存在周期性波动,可尝试更换网络环境验证
- 超过1GB的大文件建议改用分片下载接口,拆分传输降低单次请求超时概率
内容的提问来源于stack exchange,提问作者freshcodeman
相关产品推荐
相关产品推荐

