我希望能够从gather
运行的一组任务中获得结果,以进行进一步处理。
# Not real code, but an example
async for response in asyncio.gather(*[aiohttp.get(url) for url in ['https://www.google.com', 'https://www.amazon.com']]):
await process_response(response)
目前,我可以使用gather
方法来同时运行所有get
,但是必须等待它们全部处理完毕。我还是Python异步/等待的新手,所以也许我缺少一些明显的方法。
# What I can do now
responses = await asyncio.gather(*[aiohttp.get(url) for url in ['https://www.google.com', 'https://www.amazon.com']])
await asyncio.gather(*[process_response(response) for response in responses])
谢谢!
答案 0 :(得分:2)
gather
将等待所有协程完成,因此您需要寻找另一种方法。
例如,您可以使用功能asyncio.as_completed来完成您想要的功能。
import asyncio
async def echo(t):
await asyncio.sleep(t)
return t
async def main():
coros = [
echo(3),
echo(2),
echo(1),
]
for first_completed in asyncio.as_completed(coros):
res = await first_completed
print(f'Done {res}')
asyncio.run(main())
结果:
Done 1
Done 2
Done 3
[Finished in 3 sec]