如何使用async for循环迭代列表?

问题描述 投票:7回答:1

所以我需要为列表中的所有项调用async函数。这可以是一个URL列表和一个使用aiohttp的异步函数,它从每个URL获取响应。现在显然我不能做到以下几点:

async for url in ['www.google.com', 'www.youtube.com', 'www.aol.com']:

我可以使用普通的for循环但是我的代码将同步运行,我失去了获得async响应提取功能的好处和速度。

有什么方法可以转换列表,以便上述工作吗?我只需要将列表的__iter__()更改为__aiter__()方法吧?这可以通过子类化列表来实现吗?也许将它封装在一个类中?

python python-3.x asynchronous iterator python-asyncio
1个回答
12
投票

使用asyncio.as_completed

for future in asyncio.as_completed(map(fetch, urls)):
    result = await future

或者asyncio.gather

results = await asyncio.gather(map(fetch, urls))

编辑:如果你不介意有外部依赖,你可以使用aiostream.stream.map

from aiostream import stream, pipe

async def fetch_many(urls):
    xs = stream.iterate(urls) | pipe.map(fetch, ordered=True, task_limit=10)
    async for result in xs:
        print(result)

您可以使用fetch参数控制同时运行的task_limit coroutine的数量,并选择是按顺序还是尽快获得结果。

查看此demonstrationdocumentation中的更多示例。

© www.soinside.com 2019 - 2024. All rights reserved.