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

В каких ситуациях применяют конструкции async/await при программировании?

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

sobes.tech AI

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

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

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

async/await — это синтаксис для работы с асинхронными операциями в Python.
async def объявляет корутину, а await приостанавливает её выполнение, пока не завершится ожидаемая асинхронная операция, освобождая управление event loop.
Это не ускоряет CPU-вычисления, а позволяет не блокировать поток во время ожидания внешних ресурсов.

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

Например, нужно одновременно запросить данные с нескольких API и не ждать каждый запрос по очереди.

import asyncio

async def fetch_data(name, delay):
    await asyncio.sleep(delay)
    return f"{name} готово"

async def main():
    tasks = [
        asyncio.create_task(fetch_data("Запрос 1", 2)),
        asyncio.create_task(fetch_data("Запрос 2", 1)),
        asyncio.create_task(fetch_data("Запрос 3", 3)),
    ]

    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main())

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

Код показывает асинхронный запуск нескольких задач, которые имитируют ожидание I/O.

  1. fetch_data объявлена как async, значит внутри можно использовать await.
  2. asyncio.sleep(delay) имитирует неблокирующее ожидание.
  3. asyncio.create_task(...) запускает корутину как отдельную задачу event loop.
  4. asyncio.gather(*tasks) ждёт завершения всех задач сразу и собирает результаты.
  5. asyncio.run(main()) создаёт и запускает event loop для выполнения программы.

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

  • async/await используют для I/O-bound задач, а не для тяжёлых вычислений.
  • Основная польза — не блокировать поток во время ожидания сети, диска или БД.
  • await можно применять только внутри async def.
  • Для параллельного ожидания нескольких асинхронных операций часто используют asyncio.gather и create_task.
  • Если задача CPU-bound, лучше смотреть в сторону multiprocessing, threads или выносить вычисления отдельно.