Как выполнять несколько задач параллельно в asyncio aiogram 3?
Я хотел, чтобы несколько задач выполнялись параллельно, мне подсказали следующее решение, но оно не работает.
Код:
async def main():
task3 = await asyncio.create_task(dp.start_polling(bot))
task1 = await asyncio.create_task(app.start())
task2 = await asyncio.create_task(send_last_channel(app))
await asyncio.gather(task1, task2, task3, return_exceptions=True)
if __name__ == "__main__":
try:
asyncio.ensure_future(main())
asyncio.get_event_loop().run_forever()
except KeyboardInterrupt:
logger.info("Program stopped by user")
loop = asyncio.get_event_loop()
loop.run_until_complete(app.stop())
Ответы (1 шт):
Параллельности в python asyncio нет, есть конкурентность.
asyncio.create_task() позволяет запланировать конкурентное выполнение корутины (задачи). А asyncio.gather(), в свою очередь, позволяет выполнять последовательность корутин как задачи.
В вашем случае, создавая ожидания await, то есть блокировку, выполнение задач будет происходить последовательно (иначе говоря, сначала выполнится первая задача task3, затем вторая по счёту task1 и так далее), если вы хотите одновременно запустить конкуретное выполнение задач без блокировок, нужно создать последовательность и передать её в asyncio.gather().
async def main():
tasks = (dp.start_polling(bot), app.start(), send_last_channel(app))
await asyncio.gather(*tasks, return_exceptions=True)
Также в Python 3.11 был добавлен новый способ одновременного запуска задач — asyncio.TaskGroup(). Этот вариант является наиболее рекомендуемым для решения такой задачи.
async def main():
async with asyncio.TaskGroup() as task_group:
task_group.create_task(dp.start_polling(bot))
task_group.create_task(app.start())
task_group.create_task(send_last_channel(app))
Разница лишь в том, что с использованием asyncio.TaskGroup() появится больше возможностей управления поведением задач в случае возникновения исключения.