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),因为它保留对原始任务的引用。
但我仍然不清楚这是否是真的,或者如果是的话如何解决这个问题。任何帮助将不胜感激,谢谢!
归档时间: |
|
查看次数: |
1099 次 |
最近记录: |