Пять запросов к внешнему API в цикле с await: почему async не дал ускорения
Сервис собирает данные из пяти внешних источников, каждый отвечает примерно за 200 мс:
async def fetch(client, url):
resp = await client.get(url)
return resp.json()
async def collect(client, urls): # в urls пять адресов
result = []
for url in urls:
result.append(await fetch(client, url))
return result
Клиент асинхронный. Сколько примерно займёт collect и что с этим делать?
- Около 200 мс: корутины стартуют уже в момент вызова fetch, await лишь забирает готовое
- Около 1 секунды: await в цикле ждёт каждый ответ; одновременность даёт asyncio.gather
- Около 1 секунды, ускорить это можно только вынеся запросы в пул потоков через executor
- Около 200 мс: цикл for внутри корутины не блокирует event loop, запросы идут внахлёст
