Viji
@Viji
DevOps Engineer

Является ли нормальной практикой вызывать асинхронную функцию внутри цикла и как собрать все результаты?

async def my_func(value: object):
    some code
    return x


loop = asyncio.get_event_loop()

tasks = []
while True:
    task = my_func(some_object)
    tasks.append(asyncio.gather(task))
    if y == z:
        break

................
other code
................
results = loop.run_until_complete(tasks)
loop.close()


Является ли данный подход нормальным и как мне собрать/распечатать результаты всех вызовов my_func - так как я указал не работает
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
@Jack444
Если нужен ассинхронный цикл то делается это через генератор

async def my_func(value: object):
    some code
    return x

async def my_func2():
    while True:
        y = await my_func(some_object)
        if y == z:
            break
        yield y

async def my_func3():
    async for i in my_func2():
        print(i)


Или ещё как вариант собрать таски и пойти циклом по gather.
for i in await gather(*tasks):
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Hivemaster
@Hivemaster
Админ, который хочет программировать
Ваш код работает синхронно, каждая итерация блокируется до выполнения функции. Функцию gather надо вызывать с коллекцией сопрограмм, чтобы они выполнялись конкурентно.
Ответ написан
sgjurano
@sgjurano
Разработчик
Стандартный паттерн выглядит вот так:
tasks = [my_func(v) for v in values]
results = await asyncio.gather(*tasks)
Ответ написан
Ваш ответ на вопрос

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

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