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

Как запустить две асинхронные функции, одна из которых содержит бесконечный цикл?
  • 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 означает ожидание завершения функции и получения её результата, вторая не будет запущена до этого. <br/> <br/> Можно например так: <br/> <br/> <pre><code class="python">send_result = send()
polling_result = dp.start_polling(bot)
await send_result
await polling_result</code></pre> <br/> <br/> Или так: <br/> <br/> <pre><code class="python">send_result = send()
polling_result = dp.start_polling(bot)
await asyncio.gather(send_result, polling_result)</code></pre> <br/> <br/> Или даже так: <br/> <br/> <pre><code class="python">await asyncio.gather(
     send(),
     dp.start_polling(bot)
)</code></pre>
Потому что await, как следует из названия, асинхронно ожидает. Используйте <a href="https://docs.python.org/3/library/asyncio-task.html#creating-tasks" rel="nofollow">create_task</a> или <a href="https://docs.python.org/3/library/asyncio-task.html#running-tasks-concurrently" rel="nofollow">gather</a> .
Похожие вопросы