使用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
相关产品推荐
相关产品推荐

