@AlbertForest

Асинхронный http клиент без ожидания выполнения всей очереди?

Есть задача обрабатывать некоторое количество долгих http запросов (20-30 сек). Как только будет получен ответ или наступит таймаут, необходимо снова выполнить запрос не дожидаясь остальных.

Мой код:
async def get(key):
    url = f"https://site.com?key={key}"
    async with aiohttp.ClientSession() as session:
        async with session.get(url, timeout=20) as response:
            return await response.json()

coroutines = [get(key1), get(key1), get(key3)]

async def main():
    for task in asyncio.as_completed(coroutines):
        resp = await task
        print(f'resp: {resp}')


Могу ли я при завершении одной из задач как-то обновить содержимое генератора asyncio.as_completed(coroutines) не останавливая остальные задачи в нем?

В результате я хотел бы получить бесконечный цикл, который будет повторять каждый запрос, как только он будет выполнен.
Содержимое списка coroutines не постоянно. В любой момент времени могут появится новые key или устареть имеющиеся
Возможно я выбрал не верный путь для этого.
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
@AlbertForest Автор вопроса
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Zolg
В результате я хотел бы получить бесконечный цикл, который будет повторять каждый запрос, как только он будет выполнен.

Ну так и сделайте бесконечный цикл внутри get(key), в чем проблема ?
Если проблема в возврате результатов/передаче параметров - используйте очереди
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы