You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用requests.get开启stream模式,遇错误时如何避免内存泄漏?

使用requests Stream模式时的错误处理与资源释放

首先,你当前用的with语句已经能帮你处理大部分资源释放问题——只要requests.get成功返回响应对象,with块结束时会自动调用response.close(),不管块内有没有出现异常。

遇到域名解析失败这类根本没生成响应对象的错误时,完全不需要额外做关闭操作,因为连响应对象都没创建出来,自然不存在未释放的资源,也就不会有内存泄漏的问题。

你的现有代码逻辑没问题,但可以优化异常捕获的精准度,避免捕获所有Exception:

try:
    with requests.get(url, headers=self.user_agent, timeout=3, stream=True) as response:
        # 处理响应流,比如按块读取
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                # 处理读取到的内容块
                pass
except requests.exceptions.RequestException as e:
    # 仅捕获requests库抛出的请求相关异常,包括DNS解析失败、超时、连接错误等
    self.echo(f"请求url \"{url}\" 失败: {str(e)}")

补充说明:

  • 像DNS解析失败、连接超时这类错误,requests.get会直接抛出异常,不会生成响应对象,所以无需手动释放任何资源。
  • with语句的核心作用是确保当响应对象存在时,无论正常结束还是块内抛出异常,都会自动关闭它,避免stream模式下的资源占用。
  • 用requests.exceptions.RequestException代替Exception,可以避免捕获非请求相关的异常(比如代码逻辑错误),让异常处理更精准。

内容的提问来源于stack exchange,提问作者Gary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:24:21