Ответ
На асинхронную модель стоит переносить задачи, связанные с ожиданием операций ввода-вывода (I/O-bound), так как это позволяет процессору не простаивать, а выполнять другую полезную работу, пока программа ожидает ответа.
Идеальные кандидаты для асинхронности:
- Сетевые взаимодействия: HTTP-запросы к внешним API, работа с WebSocket, gRPC.
- Операции с базами данных: Чтение и запись при использовании асинхронных драйверов (например,
asyncpg
для PostgreSQL). - Работа с файловой системой: Асинхронное чтение/запись файлов.
Задачи, не подходящие для асинхронности:
- Вычислительно-интенсивные задачи (CPU-bound): Сложные математические расчеты, обработка изображений, шифрование. Такие задачи блокируют основной поток (event loop), сводя на нет все преимущества асинхронности. Для них лучше использовать многопроцессорность (
multiprocessing
).
Пример: Асинхронный HTTP-запрос
import aiohttp
import asyncio
async def fetch_data(url):
# Сессия создается один раз для множества запросов
async with aiohttp.ClientSession() as session:
# Программа не блокируется, а "ожидает" ответа от сервера
async with session.get(url) as response:
print(f"Status: {response.status}")
return await response.text()
# Запуск асинхронной функции
# asyncio.run(fetch_data('https://api.github.com'))