
asyncio: отмена задач, таймауты и утечка корутин
Задача не отменяется мгновенно, а «сгоревшая» корутина ловит CancelledError и молча продолжает работать. Разбираем, что происходит внутри asyncio при отмене и таймауте и где утекают ресурсы.

Задача не отменяется мгновенно, а «сгоревшая» корутина ловит CancelledError и молча продолжает работать. Разбираем, что происходит внутри asyncio при отмене и таймауте и где утекают ресурсы.

Разбираем, как отделить публичный интерфейс библиотеки от внутренностей: __all__, ведущее подчёркивание, __init__.py и обещания, которые потом придётся держать в каждом релизе.

time.time() врёт при переводе часов, а timeit запускает код тысячи раз не просто так. Разбираем, каким инструментом мерить что и почему разброс замеров — не шум, а информация.

Как asyncio выполняет тысячи корутин на одном потоке: что делает event loop за один оборот, при чём тут epoll и почему await не блокирует остальные задачи.
Замена dict на defaultdict в кеше выглядела безобидной. Через сорок минут после деплоя сервис ел всю память и уходил в OOM-kill каждые несколько минут. Разбираем, что произошло и как это ловить.

Процесс на Python съел 4 ГБ и упал по OOM, а вы не знаете, что именно течёт. Чек-лист: чем измерить рост памяти, где искать утечку и как отделить фрагментацию от реальной проблемы.

Опечатка в имени пакета, скомпрометированный мейнтейнер или закладка в новом релизе — три способа занести чужой код в свой проект. Разбираем, как выстроить защиту на всех этапах.

Образ на python:3.12 весит под гигабайт, собирается медленно и запускается от root. Разбираем, из чего складывается размер, как работают слои и что чинить в безопасности.

Переписать горячую функцию с Python на Rust через PyO3 — популярный совет. Разбираем, где это даёт 20-кратное ускорение, а где вы упрётесь в стоимость перехода границы GIL и получите замедление.

Три способа довезти Python-код до сервера или пользователя. У каждого своя цена: размер, воспроизводимость, скорость старта и головная боль с зависимостями. Разбираем, когда что выбирать.

Форматирование строки в logger.info, потеря контекста между модулями, дублирование записей и логирование секретов — четыре ошибки, из-за которых структурные логи в Python не работают так, как вы ожидаете.

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