
Обработка сигналов в Python: что ревьюить в коде
Обработчик сигнала, который лезет в лог или дёргает asyncio-loop, — частая причина зависшего процесса при деплое. Разбираем, на что смотреть в ревью кода с signal.

Обработчик сигнала, который лезет в лог или дёргает asyncio-loop, — частая причина зависшего процесса при деплое. Разбираем, на что смотреть в ревью кода с signal.

Очередь задач копится быстрее, чем воркеры её разбирают, задержка растёт до минут, а память течёт. Разбираем, где Celery и RQ ломаются под нагрузкой и что мерить, пока не поздно.

Тесты корутин зелёные, но продакшн падает: забытый await молча возвращает объект корутины, event loop течёт между тестами, а mock не дожидается задач. Разбираем, где именно ломается pytest-asyncio и как это ловить.

Почему asyncio.sleep не блокирует поток, откуда берётся очередь готовых колбэков и что делает event loop между итерациями — разбор внутренностей планировщика в CPython 3.12.

Пул на 20 соединений выглядит безобидно, пока сервис не начнёт отдавать 500 на пике. Разбираем, как размер и время жизни пула влияют на латентность, память базы и поведение при отказе.

Асинхронный генератор оставляет открытыми соединения, теряет aclose() при досрочном выходе и падает при финализации из чужого event loop. Разбираем, где именно ломается async for.

isinstance с Protocol работает в разы медленнее наследования от ABC, а без runtime_checkable падает с ошибкой. Разбираем, где протоколы бесплатны, а где бьют по горячему пути.

Классические паттерны GoF в Python часто схлопываются до функции, декоратора или словаря. Разбираем, где отдельный класс лишний, а где всё же нужен, и чем платишь за каждый вариант.

Сервис на Python 3.11 начал падать по OOM через несколько часов работы. Причина — самописный класс-коллекция, который выглядел как обычный список, но вёл себя иначе. Разбираем, где протекло и как это ловить.

Генератор, который читают дважды, отдаёт пустоту на втором проходе. Разбираем, какие места с ленивыми вычислениями ловить на ревью до того, как они уедут в прод.

Два способа расширять приложение сторонним кодом: сканировать каталог с модулями или объявлять плагины через entry points в метаданных пакета. Разбираем, что выбрать и чем платишь за каждый вариант.

Сервис держит в памяти миллионы мелких объектов, RSS растёт до нескольких гигабайт. __slots__ убирает __dict__ у экземпляра и режет расход памяти в разы — но ломает часть привычного поведения.