Множественный вызов функции в асинхронном режиме
Я хочу вызвать функцию много раз с разными параметрами, до те хо пор пока эти параметры не закончатся. И всё это в асинхронном режиме, чтобы пока одна версия ожидала ответа успела запуститься другая. собственно код того, как я это представляю
import asyncio
async def get(params): # запрос данных по параметрам
await asyncio.sleep(1)
def process(object): # функция для обработки полученных данных
pass
async def do_the_job(params): # получить и обработать запрос
obj = await get(params)
process(obj)
async def do_all_jobs(loop, params_list):
for parmas in params_list:
task = loop.create_task(do_the_job(params))
task
def run(params_list):
loop = asyncio.get_event_loop()
loop.run_until_complete(do_all_jobs(loop, params_list))
loop.close()
run([1,2,3,4])
Проблема в том что задачи вызываются и обрываются на await get(), где задержка, так как сама задача(do_all jobs), создать задания, уже выполнена, и она не дожидается окончания заданий.
Дополнение: Дело не в синтаксисе, Нашел способ делать это без loop и чтобы оно выполнялось асинхронно, но выглядит так будто я делаю что то не так...
async def do_all_jobs(loop, params_list):
tasks = []
for params in params_list:
task = asyncio.create_task(do_the_job(params))
tasks.append(task)
for t in tasks:
await t
Ответы (1 шт):
for t in tasks:
await t
Замени на
await asyncio.gather(*tasks)
Он аваитит их все разом, а не в порядке массива как for. И в этом случае не нужно делать таски - их сделает gather
for params in params_list:
tasks.append(do_the_job(params))
Однострочник заменяющий do_all_jobs полностью
await asyncio.gather(*map(do_the_job,params_list))