В каких ситуациях применяют конструкции 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.
fetch_dataобъявлена какasync, значит внутри можно использоватьawait.asyncio.sleep(delay)имитирует неблокирующее ожидание.asyncio.create_task(...)запускает корутину как отдельную задачу event loop.asyncio.gather(*tasks)ждёт завершения всех задач сразу и собирает результаты.asyncio.run(main())создаёт и запускает event loop для выполнения программы.
Ключевые моменты:
async/awaitиспользуют для I/O-bound задач, а не для тяжёлых вычислений.- Основная польза — не блокировать поток во время ожидания сети, диска или БД.
awaitможно применять только внутриasync def.- Для параллельного ожидания нескольких асинхронных операций часто используют
asyncio.gatherиcreate_task. - Если задача CPU-bound, лучше смотреть в сторону multiprocessing, threads или выносить вычисления отдельно.