Вам не нужно gather
их по-другому. То, как вы используете asyncio
в порядке.
В вашем task
сопрограмме удалите while
и просто добавьте к results
один раз. Вы увидите, что обе задачи вернут свои результаты.
Проблема в том, что когда вы делаете while time.time()
, вы блокируете его, так как он не асинхронный. Таким образом, он запускает цикл while
до тех пор, пока не будет выполнено условие end_time
.
Затем запускается второе, поскольку coro task
никогда не позволяло выполнять что-либо еще в это время. Поскольку оба использовали один и тот же end_time
, второе coro никогда не добавится.
Если вы хотите запустить цикл while
асинхронно, вам нужно создать для него дополнительную асинхронную логику и await
в нейваша task
функция.
РЕДАКТИРОВАТЬ: Например, если вы просто хотите вернуть его в цикл обработки событий и разрешить выполнение чего-то еще, просто поместите await asyncio.sleep(0.1)
в свой цикл while.
Пример:
async def task(id, end_time):
print('Started task ', id)
results = []
while time.time() < end_time:
results.append(1)
await asyncio.sleep(000000000.1)
return results
Возможности для улучшения:
- asyncio.run(main()
заботится о создании цикла событий
- добавление в список является дорогой операцией, попробуйте += 1
в цикле, поэтомуваш results
будет 0
в начале, затем выведите результаты, а не их len