0

我有这种方法可以og:image异步获取 html 页面的元标记,我正在使用 httpx 流式传输响应,以便在遇到og:image标记时可以停止阅读。我的问题是我遇到了严重的内存泄漏,导致整个应用程序在 40 多个请求后崩溃。这是代码示例:

async def getImg(url):
   og_line = None
   async with httpx.AsyncClient() as client:
        async with client.stream('GET', url) as response:
            async for chunk in response.aiter_lines():
                if "og:image" in chunk:
                    og_line = chunk
                    break

我的问题是我在这里通过闯入做了一些可怕的事情async for,这是可以预料的(如果是的话,我很想知道我可以如何做不同的事情),或者这是出乎意料的行为?谢谢。

4

1 回答 1

-1

你应该能够做这样的事情。使用 client.get 而不是 client.stream。您不需要将其作为流处理。您可以在 AsyncClient 中的 client.get 上等待。基本上你是说,当这个 API 调用返回时,给我返回的 API 是什么response

一旦你不处理协程,逻辑就容易多了。上下文管理器仍在正确处理它。

    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        response.raise_for_status()
        for chunk in response.iter_lines():
            if "og:image" in chunk:
                og_line = chunk
             
        return final_result_data
        ....
于 2021-06-28T14:19:22.497 回答