Вступить в клуб →
средняявопросPython и асинхронность

Пять запросов к внешнему 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, запросы идут внахлёст

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела