Что такое async / asyncio в Python
Published 29 августа 2025 г. 11:40 by max_summer
В Python async
и asyncio
— это механизмы для написания асинхронного кода, который позволяет эффективно выполнять неблокирующие операции ввода-вывода (I/O), такие как сетевые запросы, работа с файлами, базами данных и т. д.
1. Основные понятия
Асинхронность (Asynchronous Programming)
- Позволяет выполнять несколько задач параллельно (но не одновременно, как в многопоточности), переключаясь между ними, когда одна из задач ожидает завершения I/O-операции.
- В отличие от многопоточности, асинхронный код работает в одном потоке, что снижает накладные расходы на переключение контекста.
async
/ await
async def
— определяет асинхронную функцию (корутину).await
— приостанавливает выполнение корутины до завершения асинхронной операции (например, HTTP-запроса, чтения файла).
asyncio
- Стандартная библиотека Python для написания асинхронного кода.
- Предоставляет:
- Event Loop (цикл событий) — управляет выполнением корутин.
- Tasks (задачи) — обёртки над корутинами для планирования их выполнения.
- Futures — низкоуровневые объекты для работы с асинхронными операциями.
- Синхронизационные примитивы (мьютексы, семафоры, очереди).
- Поддержку сетевых протоколов (TCP, UDP, HTTP).
2. Пример асинхронного кода
Без асинхронности (блокирующий код)
```python import time
def fetch_data(): print("Запрашиваем данные...") time.sleep(2) # Блокирует выполнение на 2 секунды return "Данные получены"
start = time.time()
fetch_data()
fetch_data()
print(f"Время выполнения: {time.time() - start:.2f} сек")
**Вывод:**
Запрашиваем данные...
Запрашиваем данные...
Время выполнения: 4.00 сек
```
→ Запросы выполняются последовательно, общая задержка — 4 секунды.
С асинхронностью (asyncio
)
```python import asyncio
async def fetch_data(): print("Запрашиваем данные...") await asyncio.sleep(2) # Неблокирующая задержка return "Данные получены"
async def main(): start = time.time() task1 = asyncio.create_task(fetch_data()) task2 = asyncio.create_task(fetch_data()) await task1 await task2 print(f"Время выполнения: {time.time() - start:.2f} сек")
asyncio.run(main())
**Вывод:**
Запрашиваем данные...
Запрашиваем данные...
Время выполнения: 2.00 сек
```
→ Запросы выполняются параллельно, общая задержка — 2 секунды.
3. Ключевые компоненты asyncio
1. Корутина (coroutine
)
- Функция, объявленная с
async def
. - Не выполняется сразу, а возвращает объект корутины, который нужно запустить через
await
илиasyncio.create_task()
.
```python async def my_coroutine(): return 42
result = await my_coroutine() # Вернёт 42 ```
2. Задача (Task
)
- Планирует выполнение корутины в event loop.
- Позволяет запускать несколько корутин параллельно.
python
async def main():
task = asyncio.create_task(fetch_data())
await task # Ждём завершения задачи
3. Цикл событий (Event Loop
)
- Управляет выполнением асинхронных задач.
- Запускается через
asyncio.run()
(в Python 3.7+) илиloop = asyncio.get_event_loop()
.
```python async def main(): print("Hello") await asyncio.sleep(1) print("World")
asyncio.run(main()) # Запускает event loop ```
4. asyncio.gather()
- Запускает несколько корутин параллельно и ждёт их завершения.
python
async def main():
results = await asyncio.gather(
fetch_data(),
fetch_data(),
fetch_data()
)
print(results) # ["Данные получены", "Данные получены", "Данные получены"]
5. asyncio.wait()
- Ждёт завершения набора задач с дополнительными опциями (например,
return_when=FIRST_COMPLETED
).
python
async def main():
tasks = [asyncio.create_task(fetch_data()) for _ in range(3)]
done, pending = await asyncio.wait(tasks)
for task in done:
print(task.result())
4. Когда использовать asyncio
?
✅ I/O-bound задачи (сетевые запросы, работа с БД, файлами). ✅ Высоконагруженные серверы (FastAPI, aiohttp). ✅ Параллельное выполнение независимых операций.
❌ CPU-bound задачи (вычисления, обработка больших данных) — лучше использовать multiprocessing
или threading
.
5. Популярные библиотеки для асинхронной работы
| Библиотека | Назначение |
|------------|------------|
| aiohttp
| Асинхронные HTTP-запросы |
| aiomysql
| Асинхронная работа с MySQL |
| asyncpg
| Асинхронная работа с PostgreSQL |
| FastAPI
| Асинхронный веб-фреймворк |
| httpx
| Асинхронный HTTP-клиент |
6. Пример: Асинхронный HTTP-запрос с aiohttp
```python import aiohttp import asyncio
async def fetch_url(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text()
async def main(): urls = [ "https://example.com", "https://python.org", "https://github.com" ] tasks = [fetch_url(url) for url in urls] results = await asyncio.gather(*tasks) for url, content in zip(urls, results): print(f"{url} — {len(content)} байт")
asyncio.run(main()) ```
7. Подводные камни asyncio
- Блокирующие вызовы (например,
requests.get()
,time.sleep()
) замораживают event loop. → Используйте асинхронные аналоги (aiohttp
,asyncio.sleep()
). - Глобальный event loop — в некоторых случаях может потребоваться явное управление (
asyncio.get_event_loop()
). - Отладка — асинхронный код сложнее отлаживать из-за нелинейного выполнения.
- Синхронизация — при работе с общими ресурсами нужны
asyncio.Lock()
,asyncio.Semaphore()
.
8. Заключение
async/await
— синтаксис для написания асинхронного кода.asyncio
— библиотека для управления асинхронными задачами.- Преимущества: высокая производительность при I/O-операциях, низкие накладные расходы.
- Недостатки: не подходит для CPU-bound задач, сложнее в отладке.
🚀 Когда использовать?
- Веб-скрапинг (aiohttp
).
- Веб-серверы (FastAPI
, aiohttp
).
- Работа с базами данных (asyncpg
, aiomysql
).
- Микросервисы с высокой нагрузкой.
Если у вас есть дополнительные вопросы — спрашивайте! 😊
Similar posts
There are no similar posts yet.
0 comments
There are no comments