Sobes.tech
Назад к вопросам
Junior — Middle
67

Можете объяснить, как реализована работа асинхронных функций с использованием ключевых слов async и await в Python?

Компании, где спрашивали
Effective Mobile

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

async и await в Python используются для написания асинхронного кода, который не блокирует выполнение на операциях ожидания, например при работе с сетью или файлами. async def объявляет корутину, а await приостанавливает её выполнение до завершения другой асинхронной операции. Это позволяет эффективно переключаться между задачами в одном потоке.

Определение:

async def создаёт асинхронную функцию, которая при вызове возвращает объект-корутину, а не сразу выполняет код. await можно использовать внутри async def, чтобы временно приостановить выполнение корутины и передать управление event loop, пока не завершится ожидаемая операция. Когда результат готов, выполнение продолжается с этого же места.

Пример использования:

Типичный случай — параллельная обработка нескольких сетевых запросов или ожидание ответов от внешнего API.

import asyncio

async def fetch_data():
    await asyncio.sleep(1)
    return "data"

async def main():
    result = await fetch_data()
    print(result)

asyncio.run(main())

Пояснение кода:

  • async def fetch_data() объявляет асинхронную функцию.
  • await asyncio.sleep(1) не блокирует поток на 1 секунду, а отдаёт управление event loop.
  • return "data" возвращает результат после завершения корутины.
  • async def main() — точка входа для асинхронной логики.
  • await fetch_data() ждёт завершения fetch_data() и получает результат.
  • asyncio.run(main()) запускает event loop и выполняет корутину main().

Ключевые моменты:

  • async def создаёт корутину, которая выполняется асинхронно.
  • await можно применять только внутри async def.
  • Асинхронность в Python полезна для I/O-bound задач, а не для тяжёлых вычислений.
  • await не ускоряет код сам по себе, а позволяет не блокировать выполнение во время ожидания.
  • Для запуска корутин обычно используется event loop, например через asyncio.run().
  • Асинхронный код сложнее синхронного, но даёт хорошую масштабируемость при большом количестве одновременных ожиданий.