Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: await, function, async

Какие типичные ошибки в асинхронном коде могут приводить к замедлению работы, включая забытый await?

Вопрос проверяет понимание типичных ловушек при работе с asyncio и асинхронными фреймворками, которые приводят к неожиданному падению производительности.

Короткий ответ

В асинхронном коде часто встречаются ошибки: использование блокирующих операций (например, time.sleep или requests) внутри async функций, забытый await при вызове корутин, из-за чего они не выполняются параллельно, а просто создаются. Также вредно запускать тяжёлые CPU-вычисления в event loop без вынесения в отдельный поток/процесс. Ещё одна типичная ошибка — слишком мелкое или наоборот слишком крупное разбиение задач: слишком много корутин создаёт накладные расходы, а слишком мало блокирует event loop. Все эти проблемы приводят к тому, что приложение теряет преимущество асинхронной модели и начинает вести себя как медленный синхронный код.

Длинный ответ

1. Общая идея асинхронности и где всё ломается

Определение.
Асинхронный код в Python — это код на основе async/await, который использует event loop для переключения между задачами во время ожидания I/O, не блокируя поток.

Принцип:

  • Пока одна корутина ждёт I/O, event loop может выполнять другую.

  • Если внутри async функции делать блокирующие операции, event loop «замирает».

2. Забытый await

Одна из самых частых ошибок:

Python

async def handler():
    do_work()  # ОШИБКА: забыли await

Проблема:

  1. Если do_work — корутина, без await она не запускается, а просто создаётся объект coroutine.

  2. Логика не выполняется вовремя или вообще не выполняется.

  3. Или код выполняется последовательно, а не параллельно, если мы собирались использовать asyncio.gather.

Правильный вариант:

Python

async def handler():
    await do_work()

Или, если нужно параллельно:

Python

async def handler():
    task1 = asyncio.create_task(do_work1())
    task2 = asyncio.create_task(do_work2())
    await asyncio.gather(task1, task2)

3. Блокирующие операции внутри async функций

Частая ошибка — использовать синхронные блокирующие вызовы:

  1. time.sleep вместо asyncio.sleep.

  2. requests.get вместо httpx.AsyncClient().get.

  3. Тяжёлые вычисления на CPU в обычном коде.

Пример ошибки:

Python

import time

async def handler():
    time.sleep(5)  # блокирует event loop на 5 секунд

Правильно:

Python

import asyncio

async def handler():
    await asyncio.sleep(5)

Для HTTP-запросов:

  • Неправильно: requests.get(...) в async коде.

  • Правильно: httpx.AsyncClient().get(...) или aiohttp.

4. Тяжёлые CPU-вычисления в event loop

Асинхронность не ускоряет CPU-вычисления. Если в async функции делать тяжёлые операции (парсинг огромного файла, сложный цикл):

  • Event loop не переключается на другие задачи.

  • Все остальные запросы «замирают».

Решение:

  1. Вынести тяжёлый код в отдельный поток/процесс:

    • asyncio.to_thread.

    • ProcessPoolExecutor.

Python

import asyncio

def heavy_cpu():
    # тяжёлые вычисления
    ...

async def handler():
    result = await asyncio.to_thread(heavy_cpu)
    return result

5. Неправильное использование asyncio.gather и задач

Ошибки:

  1. Не использовать gather, когда можно параллелить независимые операции.

  2. Создавать слишком много задач (десятки тысяч одновременно), что приводит к накладным расходам.

Важно:

  • Параллелить только то, что реально может выполняться одновременно (I/O).

  • Ограничивать количество одновременных задач (semaphore, пул).

6. «Асинхронность на бумаге» — синхрон внутри

Иногда код формально асинхронный (async def), но внутри всё равно:

  • Синхронный ORM (без async).

  • Синхронные HTTP-вызовы.

  • Синхронный драйвер Redis/кэша.

В итоге:

  • Нет выигрыша от async, а код становится сложнее.

  • Лучше либо перейти на async-версии библиотек, либо оставить код синхронным.

7. Вывод

Типичные ошибки в асинхронном коде — это забытый await, использование блокирующих операций в async функциях, тяжёлые CPU-вычисления в event loop и неправильная организация параллелизма (слишком много или слишком мало задач). Все они приводят к тому, что приложение перестаёт эффективно использовать асинхронную модель и работает медленнее, чем могло бы. Чтобы этого избежать, нужно осознанно использовать await, выбирать async-библиотеки и выносить тяжёлые операции из event loop.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#await

#function

#async

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.