
TaskGroup в Python 3.11: почему он вытесняет gather
asyncio.gather молча продолжает работу, когда одна из задач падает, а её соседи повисают в фоне. TaskGroup из Python 3.11 закрывает эту дыру структурной отменой и группировкой ошибок.

asyncio.gather молча продолжает работу, когда одна из задач падает, а её соседи повисают в фоне. TaskGroup из Python 3.11 закрывает эту дыру структурной отменой и группировкой ошибок.

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

Задача не отменяется мгновенно, а «сгоревшая» корутина ловит 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-код до сервера или пользователя. У каждого своя цена: размер, воспроизводимость, скорость старта и головная боль с зависимостями. Разбираем, когда что выбирать.