Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Async
Async (асинхронное программирование) — это подход к разработке, где код может выполняться без блокирования потока выполнения. Вместо того чтобы ждать завершения длительной операции (сетевой запрос, чтение файла), программа может продолжать выполнять другой код и вернуться к результату позже.
Основные понятия
Синхронный код блокирует выполнение:
import time
def fetch_data():
time.sleep(2) # Блокирует на 2 секунды
return "данные"
result = fetch_data() # Ждём 2 секунды
print(result)
Асинхронный код не блокирует:
import asyncio
async def fetch_data():
await asyncio.sleep(2) # Не блокирует, просто ждёт
return "данные"
async def main():
result = await fetch_data()
print(result)
asyncio.run(main())
Ключевые концепции
async/await — синтаксис асинхронного программирования в Python:
async def— определяет асинхронную функцию (корутину)await— ждёт результата асинхронной операции, не блокируя поток
Event Loop (цикл событий) — сердце асинхронного программирования. Он управляет выполнением корутин:
async def task1():
print("Task 1 начата")
await asyncio.sleep(1)
print("Task 1 завершена")
async def task2():
print("Task 2 начата")
await asyncio.sleep(0.5)
print("Task 2 завершена")
async def main():
# Запускаем обе задачи параллельно
await asyncio.gather(task1(), task2())
# Выполнится за ~1 секунду, а не за 1.5
asyncio.run(main())
Когда использовать Async
Идеально для I/O-bound операций:
- HTTP запросы (FastAPI, aiohttp)
- Работа с базами данных (asyncpg, motor для MongoDB)
- Чтение/запись файлов
- WebSocket соединения
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 fetch_multiple_urls(urls):
tasks = [fetch_url(url) for url in urls]
results = await asyncio.gather(*tasks)
return results
НЕ подходит для CPU-bound операций:
- Вычисления
- Обработка данных
- Парсинг
Для таких задач используй multiprocessing или concurrent.futures.
Async/Await vs Callbacks
Callbacks (старый подход):
def fetch_data(callback):
# Сложно читать, callback hell
def on_success(data):
def on_processed(result):
callback(result)
process(data, on_processed)
request(on_success)
Async/Await (современный подход):
async def fetch_data():
data = await request()
result = await process(data)
return result
# Читается как синхронный код, но работает асинхронно
Best Practices
- Используй async контекстные менеджеры для управления ресурсами:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()
- Избегай блокирующих операций внутри async функций:
# Плохо
async def bad_example():
time.sleep(1) # Блокирует весь event loop!
# Хорошо
async def good_example():
await asyncio.sleep(1) # Не блокирует
- Используй asyncio.gather/TaskGroup для параллельного выполнения:
# Python 3.11+
async def main():
async with asyncio.TaskGroup() as tg:
task1 = tg.create_task(fetch_data(1))
task2 = tg.create_task(fetch_data(2))
Async — это мощный инструмент для создания высокопроизводительных приложений, особенно для I/O-heavy нагрузок.