← Назад к вопросам

Что такое Async?

1.8 Middle🔥 81 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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

  1. Используй async контекстные менеджеры для управления ресурсами:
async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
        data = await response.json()
  1. Избегай блокирующих операций внутри async функций:
# Плохо
async def bad_example():
    time.sleep(1)  # Блокирует весь event loop!

# Хорошо
async def good_example():
    await asyncio.sleep(1)  # Не блокирует
  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 нагрузок.

Что такое Async? | PrepBro