Как использовать `asyncio.create_task()` для запуска задачи?

Используйте asyncio.create_task(корутина) для запуска корутины в качестве задачи (Task) в текущем цикле событий. Функция возвращает объект Task, который представляет выполняющуюся корутину. Например:

    import asyncio

    async def my_coroutine():
      await asyncio.sleep(1)
      print("Задача выполнена!")

    async def main():
      task = asyncio.create_task(my_coroutine())
      await asyncio.sleep(0.5) # Даем задаче время запуститься
      print("Главная функция продолжает работу.")
      await task  # Дожидаемся завершения задачи

    asyncio.run(main())
  
Важно: если вы не будете дожидаться завершения задачи (например, с помощью await task), то корутина может быть прервана при завершении цикла событий.

asyncio.create_task() - это функция в Python, предоставляемая модулем asyncio, которая позволяет запланировать выполнение сопрограммы (coroutine) в качестве задачи (Task) в event loop'е (цикле событий). Это основной способ запустить асинхронную операцию конкурентно с остальным кодом. Вот как это использовать:

Основной принцип:

  1. Определите асинхронную функцию (сопрограмму) с использованием ключевого слова async.
  2. Используйте asyncio.create_task(coroutine), передав сопрограмму в качестве аргумента. Эта функция возвращает объект Task.
  3. Объект Task представляет собой запланированную для выполнения сопрограмму. Он будет выполнен в фоновом режиме event loop'ом.
  4. Обычно вы хотите дождаться завершения задачи (Task), используя await task. Если не использовать await, ваша основная программа может завершиться до того, как задача будет завершена.

Пример:

import asyncio

async def my_coroutine(name):
    print(f"Задача {name} запущена")
    await asyncio.sleep(1)  # Имитация асинхронной операции
    print(f"Задача {name} завершена")
    return f"Результат задачи {name}"

async def main():
    # Создание задач
    task1 = asyncio.create_task(my_coroutine("1"))
    task2 = asyncio.create_task(my_coroutine("2"))

    # Ожидание завершения задач
    result1 = await task1
    result2 = await task2

    print(f"Результат задачи 1: {result1}")
    print(f"Результат задачи 2: {result2}")

if __name__ == "__main__":
    asyncio.run(main())

Пояснения к примеру:

  • my_coroutine(name): Асинхронная функция, которая печатает сообщения о начале и конце работы и имитирует асинхронную операцию с помощью asyncio.sleep().
  • asyncio.create_task(my_coroutine("1")) и asyncio.create_task(my_coroutine("2")): Создают два объекта Task, которые запланированы для выполнения параллельно.
  • await task1 и await task2: Гарантируют, что основная функция main() дождется завершения каждой задачи, прежде чем продолжить выполнение. await приостанавливает выполнение main() до тех пор, пока задача не будет завершена, после чего возвращает результат работы сопрограммы (в данном случае, строка).
  • asyncio.run(main()): Запускает event loop и выполняет асинхронную функцию main(). Это основной способ запуска асинхронного кода.

Важные моменты:

  • Не забывайте await задачи, если вам важен результат ее работы или необходимо дождаться ее завершения.
  • asyncio.create_task() возвращает объект Task, который можно использовать для отмены задачи (task.cancel()) или для проверки ее статуса (task.done(), task.cancelled(), task.exception()).
  • В асинхронном коде использование time.sleep() (синхронная функция сна) блокирует event loop и препятствует параллельному выполнению задач. Используйте asyncio.sleep() вместо этого.
0