Python async await: основы асинхронного программирования
Python 3.5 представил новый синтаксис для асинхронного программирования - ключевые слова async и await. Асинхронное программирование позволяет написать эффективный и отзывчивый код, который может обрабатывать множество задач одновременно, без блокирования главного потока выполнения.
Ключевое слово async используется для определения корутины - специальной функции, которая может быть приостановлена и возобновлена во время выполнения для обработки других задач. Ключевое слово await указывает, что функция должна быть приостановлена до тех пор, пока не будет выполнена асинхронная операция.
Давайте рассмотрим некоторые примеры кода. Предположим, у нас есть функция, которая эмулирует долгую операцию, например, загрузку файла.
import asyncio
async def load_file(file_name):
print(f"Загрузка файла {file_name} началась")
# Эмуляция долгой операции
await asyncio.sleep(5)
print(f"Загрузка файла {file_name} завершена")
async def main():
await asyncio.gather(
load_file("file1.txt"),
load_file("file2.txt"),
load_file("file3.txt")
)
# Запуск асинхронной программы
asyncio.run(main())
В этом примере мы создали асинхронную функцию load_file, которая загружает файлы. Мы использовали ключевое слово await, чтобы приостановить выполнение функции на время эмуляции долгой операции.
Затем мы создали функцию main, которая использует asyncio.gather для одновременного выполнения всех задач в фоновом режиме. Мы передали три вызова load_file, чтобы загрузить три файла одновременно.
Вся асинхронная программа запускается с помощью asyncio.run(main()). Это запускает событийный цикл asyncio, который выполняет асинхронный код.
Когда мы запускаем этот код, мы увидим, что загрузка файлов происходит параллельно, и программа не блокируется в ожидании завершения каждой операции. Вместо этого она продолжает выполнение других задач, пока операция загрузки файлов не будет закончена.
Python также предоставляет возможность обрабатывать исключения при использовании async-await. Рассмотрим следующий пример:
import asyncio
async def divide(a, b):
try:
result = a / b
print(f"Результат деления: {result}")
except ZeroDivisionError:
print("На ноль делить нельзя!")
async def main():
await divide(10, 2)
await divide(10, 0)
await divide(20, 4)
# Запуск асинхронной программы
asyncio.run(main())
В этом примере мы определили асинхронную функцию divide, которая делит одно число на другое. Мы использовали конструкцию try-except, чтобы перехватить и обработать исключение, возникающее при делении на ноль.
Затем мы создали функцию main, которая вызывает функцию divide несколько раз с разными аргументами.
Когда мы запускаем этот код, мы видим, что деление на ноль вызывает исключение, но программа не завершается. Вместо этого она продолжает выполнение других задач. Это позволяет нам элегантно обрабатывать исключения в асинхронном коде.
Ключевые слова async и await открывают новые возможности для асинхронного программирования в Python. Они позволяют создавать эффективный и отзывчивый код, исполняющийся параллельно. Вы можете использовать их для выполнения операций в фоновом режиме, обработки сетевых запросов, работы с БД и многого другого. Они отлично дополняют существующие библиотеки и фреймворки, такие как asyncio, aiohttp и asyncio-database.
Вывод: Python async и await - мощные инструменты для асинхронного программирования, позволяющие создавать отзывчивые и эффективные приложения. Они значительно упрощают создание асинхронного кода и обработку параллельных задач. Ознакомившись с ними, вы сможете сделать свои программы ещё лучше и более производительными.