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

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

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

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

property — не магия, а обёртка над протоколом дескрипторов. Разбираем, что вызывается при доступе к атрибуту, почему __set__ побеждает __dict__ и где кроется цена абстракции.

После падения воркера RabbitMQ переотдаёт сообщение, и платёж списывается второй раз. Разбираем, почему exactly-once — миф на уровне доставки и как строить идемпотентность на стороне обработчика.

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

Воркер перезапустился, задача выполнилась дважды, клиенту списали деньги два раза. Разбираем, почему брокеры доставляют задачи повторно и как построить идемпотентность на уровне ключа и БД.

Два воркера забрали одну и ту же задачу, cron-джоба продублировалась на трёх нодах. Разбираем, как устроены брокер, идемпотентность и лидер-локи в распределённом планировщике на Python.

Как переписывать старый Python-код в проекте, который уже приносит деньги: тесты-сети, характеризующие тесты, feature-флаги и правило маленьких шагов вместо большого переписывания.

Воркеры простаивают, а задачи копятся в очереди. Разбираем, почему наивный планировщик на Celery деградирует под нагрузкой и что даёт справедливое распределение, батчинг и prefetch=1 на цифрах до и после.

Один cron-джоб на трёх воркерах отправил клиентам письмо трижды. Разбираем, почему APScheduler и наивный планировщик дублируют задачи в распределённой среде и как это лечить блокировкой в БД.

Обмен объектами между процессами в multiprocessing проходит через pickle — и на больших массивах это стоит секунд и гигабайтов. Разбираем, где именно теряется время и чем pickle можно обойти.