Как можно одновременно выполнить две асинхронные функции?

Как запустить две асинхронные функции, одна из которых содержит бесконечный цикл?
  • 16 марта 2024 г. 12:29
Ответы на вопрос 3
Существует несколько способов выполнить две асинхронные функции одновременно в Python. Один из них - использовать конструкцию asyncio.gather():
```python
import asyncio

async def async_function1():
    # код первой асинхронной функции
    await asyncio.sleep(1)
    print("Функция 1 завершена")

async def async_function2():
    # код второй асинхронной функции
    await asyncio.sleep(2)
    print("Функция 2 завершена")

async def main():
    await asyncio.gather(async_function1(), async_function2())

asyncio.run(main())
```

Для случая, когда одна из двух асинхронных функций содержит бесконечный цикл, можно воспользоваться методом asyncio.create_task():
```python
import asyncio

async def async_function1():
    while True:
        # код первой асинхронной функции
        await asyncio.sleep(1)
        print("Функция 1 выполняется")

async def async_function2():
    # код второй асинхронной функции
    await asyncio.sleep(2)
    print("Функция 2 завершена")

async def main():
    task1 = asyncio.create_task(async_function1())
    task2 = asyncio.create_task(async_function2())
    
    await task1
    await task2

asyncio.run(main())
```

В этом примере функция async_function1() будет выполняться в бесконечном цикле, в то время как функция async_function2() выполнится только один раз после задержки.
Всё так и должно быть, ведь await означает ожидание завершения функции и получения её результата, вторая не будет запущена до этого. 

Можно например так:

send_result = send()
polling_result = dp.start_polling(bot)
await send_result
await polling_result


Или так:

send_result = send()
polling_result = dp.start_polling(bot)
await asyncio.gather(send_result, polling_result)


Или даже так:

await asyncio.gather(
     send(),
     dp.start_polling(bot)
)
Потому что await, как следует из названия, асинхронно ожидает. Используйте create_task или gather .
Похожие вопросы