i3a4em
@i3a4em

Асинхронный 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 или устареть имеющиеся
Возможно я выбрал не верный путь для этого.
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
i3a4em
@i3a4em Автор вопроса
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Zolg
В результате я хотел бы получить бесконечный цикл, который будет повторять каждый запрос, как только он будет выполнен.

Ну так и сделайте бесконечный цикл внутри get(key), в чем проблема ?
Если проблема в возврате результатов/передаче параметров - используйте очереди
Ответ написан
@bacon
Варианты:
1 ставишь сразу все задачи, одновременное выполнение контролируешь через asyncio.Semaphore
2. кладешь задачи в очередь, одновременное выполнение контролируешь количеством исполнителей
3. упрошенный п2, делаешь через async pool.map (может и в стандартных есть, точно не помню, если нет, поищи готовые решения)
4. можно сделать asyncio.wait с FIRST_COMPLETED и руками добавлять новые задачи
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы