Ответ
Асинхронность — это модель выполнения кода, позволяющая выполнять несколько задач одновременно в одном потоке, не блокируя его. Это особенно эффективно для I/O-bound операций (операций ввода-вывода), таких как сетевые запросы, работа с файлами или базами данных, где программа большую часть времени ожидает ответа.
В Python асинхронность реализуется с помощью библиотеки asyncio
и ключевых слов async
/await
.
Основные концепции:
- Event Loop (Цикл событий): Ядро
asyncio
. Это диспетчер, который отслеживает состояние всех задач и запускает ту, которая готова к выполнению. - Coroutine (Корутина или сопрограмма): Функция, определенная с помощью
async def
. Ее выполнение можно приостановить и возобновить. При вызове она возвращает объект корутины, а не выполняет код сразу. await
: Оператор, который приостанавливает выполнение текущей корутины и передает управление обратно в цикл событий до тех пор, пока ожидаемая задача (другая корутина или I/O операция) не будет завершена.
Практический пример:
В этом примере две "долгие" задачи выполняются конкурентно. Общее время выполнения будет равно времени самой долгой задачи (~3 секунды), а не их сумме (~5 секунд), как было бы при синхронном выполнении.
import asyncio
import time
async def fetch_data(delay, source):
print(f"Начинаю загрузку из {source}...")
await asyncio.sleep(delay) # Имитация долгого сетевого запроса
print(f"Данные из {source} загружены.")
return { "source": source, "delay": delay }
async def main():
start_time = time.time()
# Запускаем обе корутины как задачи, не дожидаясь их завершения
task1 = asyncio.create_task(fetch_data(3, "API"))
task2 = asyncio.create_task(fetch_data(2, "Database"))
# Ожидаем завершения обеих задач
result1 = await task1
result2 = await task2
end_time = time.time()
print(f"Все задачи выполнены за {end_time - start_time:.2f} секунд.")
print(f"Результаты: {result1}, {result2}")
# Запуск главной асинхронной функции
asyncio.run(main())
Вывод: Асинхронность позволяет эффективно использовать ресурсы процессора во время ожидания, что критически важно для создания высокопроизводительных сетевых приложений.