Как создать асинхронную функцию с использованием `async def`?

Асинхронная функция создается с использованием ключевых слов async def вместо def. Например:
async def my_async_function():
    await asyncio.sleep(1) # Пример асинхронной операции
    return "Готово!"
  

Для создания асинхронной функции в Python используется ключевое слово async def. Это ключевое слово указывает, что функция является сопрограммой (coroutine), и ее выполнение может быть приостановлено и возобновлено в определенные моменты, не блокируя основной поток выполнения программы.

Вот простой пример:


import asyncio

async def my_async_function():
    print("Начало выполнения асинхронной функции")
    await asyncio.sleep(1) #  Приостанавливаем выполнение на 1 секунду
    print("Завершение выполнения асинхронной функции")

async def main():
    await my_async_function()

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

Разберем пример:

  • async def my_async_function(): определяет асинхронную функцию с именем my_async_function.
  • await asyncio.sleep(1): Ключевое слово await используется для приостановки выполнения функции до тех пор, пока не завершится операция, к которой оно применяется. В данном случае, функция приостанавливается на 1 секунду. Функция asyncio.sleep() сама по себе является асинхронной.
  • async def main(): определяет еще одну асинхронную функцию, которая вызывает my_async_function.
  • asyncio.run(main()): Эта строка запускает event loop (цикл событий) asyncio и выполняет асинхронную функцию main(). Функция asyncio.run() является самым простым способом запускать асинхронный код, но она создает новый event loop и закрывает его по завершении. Если вам нужно интегрировать асинхронный код в существующий event loop, вам могут потребоваться другие методы.

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

  • Асинхронные функции должны вызываться с использованием ключевого слова await или использоваться в качестве задач (tasks) в цикле событий asyncio.
  • await может использоваться только внутри async def функций.
  • Асинхронные функции позволяют эффективно обрабатывать ввод/вывод (I/O) операции, такие как запросы к сети, чтение/запись файлов и т.д., не блокируя основной поток выполнения.

В этом примере мы используем asyncio.sleep() для имитации длительной операции. В реальных приложениях вместо этого будут использоваться асинхронные функции для работы с сетью, базами данных или другими ресурсами.

0