gpt4 book ai didi

python - 确保 aiohttp/asyncio 中递归函数的 future

转载 作者:行者123 更新时间:2023-12-01 06:42:36 25 4
gpt4 key购买 nike

我遇到了在事件循环中未正确调用递归函数的问题。我有以下内容:

async def get_response(session, url, attempt=0):
async with session.get(url) as response:
if response.status == 200:
return await response.json()
elif attempt < 3:
# This never gets called, a coroutine is returned
return get_response(session, url, attempt + 1)
else:
return None

async def main(loop):
output = []
urls = ["https://httpbin.org/json"]
async with aiohttp.ClientSession(loop=loop) as session:
tasks = []
for url in urls:
tasks.append(asyncio.ensure_future(get_response(session, url)))
for future in await asyncio.gather(*tasks):
output.append(future)
return output

if __name__ == '__main__':
loop = asyncio.get_event_loop()
output = loop.run_until_complete(main(loop))

问题出现在 get_response如果 attempt < 3它实际上不会再次运行该函数。 以上代码自 https://httpbin.org/json 起就可以正常工作将返回 200 代码。如果我错了(因为我可能是错的)请纠正我,但我认为由于该函数的迭代不在 main 中的任务列表中。那么它实际上不会运行吗?当我调试时得到的返回是一个实际的协程对象,而不是 None正如我所愿。

确保 future 内递归函数的正确方法是什么?如果需要的话会再次调用吗?

最佳答案

由于 get_response 是异步的,因此您在调用它时需要等待它,即使是从它本身这样做也是如此。所以,你需要改变:

            return get_response(session, url, attempt + 1)

至:

            return await get_response(session, url, attempt + 1)

关于python - 确保 aiohttp/asyncio 中递归函数的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59378068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com