2

我最初是使用 httpx 发现的,但它也适用于更为人所知的请求,因此我将在示例中使用后者。

我正在并行发出多个请求,其中数据来自生成器,该生成器通过读取文件及时创建字节块。我设置了计数器/锁来限制并发请求的数量,以避免在内存中积累过多的数据。响应累积在一个列表中,因为我需要在完成后从标题中提取一些数据。

这并没有完全按预期工作,随着请求的执行,内存使用量似乎继续增加。我发现这是因为 requests 保留了对 request body 的引用,从而阻止了 ref 计数达到 0,因此数据没有被垃圾收集。

一个最小的可重现示例:

import os
import sys
import requests

response = requests.put("https://httpbin.org/put", data=os.urandom(100000))
response.request.body  # a bunch of bytes
sys.getrefcount(response.request.body)  # I get 2

对于 httpx,引用存储在httpx.Response.request.stream._body.

我通过在累积响应之前删除对请求的引用解决了我的问题,但这是预期的吗?这很难追踪,在我看来,这会导致很多无意的内存泄漏,就像我正在经历的那样。

4

0 回答 0