Асинхронное программирование
Асинхронное программирование — это подход, который позволяет выполнять задачи одновременно,
не блокируя основной поток выполнения программы.
В Python для этого используется модуль asyncio
,
который предоставляет инструменты для работы с асинхронным кодом.
Основные понятия
- Синхронный код: Код выполняется последовательно, одна операция за другой.
- Асинхронный код: Код может приостанавливать выполнение одной задачи и переключаться на другую, что позволяет эффективно использовать ресурсы.
- Корутина (coroutine): Специальная функция, которая может приостанавливать своё выполнение и возобновлять его позже.
- Событийный цикл (event loop): Управляет выполнением корутин и переключается между ними.
Ключевые элементы asyncio
Корутины
Корутины — это функции, определённые с помощью ключевого слова async def
. Они могут приостанавливать своё выполнение с помощью await
.
Ключевое слово await
Ключевое слово await
используется для приостановки выполнения корутины до завершения другой корутины или асинхронной операции.
Событийный цикл (Event Loop)
Событийный цикл управляет выполнением корутин. Он автоматически создаётся при вызове asyncio.run()
.
Основные функции asyncio
asyncio.run()
Запускает корутину и управляет событийным циклом.
Пример:asyncio.gather()
Запускает несколько корутин одновременно и ждёт их завершения.
Пример:asyncio.create_task()
Создаёт задачу (Task) из корутины, которая выполняется в фоновом режиме.
Пример:Примеры использования
Пример 1: Асинхронный HTTP-запросИспользование библиотеки aiohttp
для асинхронных HTTP-запросов.
Установим библиотеку aiohttppip install aiohttp
<!DOCTYPE html> <html lang="ru"> <head> <title>Vozhzhaev.ru</title>
Пример 2: Параллельное выполнение задач
Обратите внимание, что все три функции task()
запустились одновременно!
Пример 3: Ограничение количества одновременных задач
Использование семафоров для ограничения количества одновременно выполняемых задач.
В этом примере Функции C и D запустятся только тогда, когда выполнятся A и B.
Рекомендации
Используйте асинхронное программирование для задач, связанных с вводом-выводом (I/O-bound), таких как сетевые запросы, работа с файлами и базами данных.
Избегайте блокирующих операций (например,
time.sleep()
), используйтеawait asyncio.sleep()
.Для работы с HTTP-запросами используйте библиотеку
aiohttp
.Для работы с базами данных используйте асинхронные драйверы, такие как
asyncpg
для PostgreSQL илиaiomysql
для MySQL.
Асинхронное программирование в Python с использованием asyncio
позволяет эффективно выполнять задачи, связанные с вводом-выводом, без блокировки основного потока выполнения. Это особенно полезно для создания высокопроизводительных приложений, таких как веб-серверы, парсеры и системы обработки данных.