在 for 循环中运行异步函数时 Asyncio + Aiohttp 内存泄漏 (python)

Bef*_*777 6 python python-asyncio aiohttp

我正在制作一个 python 函数,它向 api 发出很多请求。该函数的工作原理如下:

async def get_one(session, url):
    try:
        with session.get(url) as resp:
            resp = await resp.json()
    except:
        resp = None
    return resp, url

async def get_all(session, urls):
    tasks = [asyncio.create_task(get_one(session, url)) for url in urls]
    results = await asyncio.gather(*tasks)
    return results

async def make_requests(urls):
    timeout = aiohttp.ClientTimeout(sock_read=10, sock_connect=10, total=0.1*len(urls))
    connector = aiohttp.TCPConnector(limit=125)
    async with aiohttp.ClientSession(connector=connector, skip_auto_headers=['User-Agent'], timeout=timeout) as session:
        data = await get_all(session, ids)
        return data

def main(urls):
    results = []

    while urls:
        retry = []
        response = asyncio.run(make_requests(urls))
        for resp, url in response:
            if resp is not None:
                results.append(resp)
            else:
                retry.append(url)
        urls = retry

    return results
Run Code Online (Sandbox Code Playgroud)

问题是我的函数不断积累内存,特别是当“get_one”函数内的 try- except 块中有更多错误时,我必须重试的次数越多,它消耗的内存就越多(某些东西阻止 python 收集垃圾)。

我遇到了一个旧的答案(Asyncio with内存泄漏(Python)),指出create_task()负责此(或ensure_future),因为它保留对原始任务的引用。

但我仍然不清楚这是否是真的,或者如果是的话如何解决这个问题。任何帮助将不胜感激,谢谢!