Как выполнять несколько задач параллельно в 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 шт):

Автор решения: Ben Puls

Параллельности в 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() появится больше возможностей управления поведением задач в случае возникновения исключения.

→ Ссылка