Код без GIL запускается одной командой, а зависимости к этому готовы не все
Проверка занимает вечер: ставите сборку python3.14t, прогоняете тесты и смотрите, где C-расширение роняет интерпретатор, а где два потока портят общий словарь. Со стороны CPython работа сделана: в 3.13 сборку без глобальной блокировки отдавали как экспериментальную, в 3.14 она стала официально поддерживаемой. Узкое место переехало в экосистему: пакет с C-кодом заводится в такой сборке, только если его пересобрали и проверили под неё.
На PyCon US 2026 Томас Ваутерс, который занимается CPython 25 лет и входит в steering council, прошёл по всей истории: зачем блокировку вообще снимали, что из этого получилось к сегодняшнему дню и станет ли сборка без GIL единственной. Конспект доклада опубликовал LWN.
#cpython
Проверка занимает вечер: ставите сборку python3.14t, прогоняете тесты и смотрите, где C-расширение роняет интерпретатор, а где два потока портят общий словарь. Со стороны CPython работа сделана: в 3.13 сборку без глобальной блокировки отдавали как экспериментальную, в 3.14 она стала официально поддерживаемой. Узкое место переехало в экосистему: пакет с C-кодом заводится в такой сборке, только если его пересобрали и проверили под неё.
На PyCon US 2026 Томас Ваутерс, который занимается CPython 25 лет и входит в steering council, прошёл по всей истории: зачем блокировку вообще снимали, что из этого получилось к сегодняшнему дню и станет ли сборка без GIL единственной. Конспект доклада опубликовал LWN.
#cpython
LWN.net
Free-threaded Python: past, present, and future
Probably the biggest change for Python over the last five years or so is the advent of the 'fre [...]
Научные библиотеки сошлись на 3.14t как общей цели free-threading
Если вы держите отдельное окружение под сборку без GIL, зоопарк собранных колёс наконец сокращается: поддержку 3.13t крупные научные библиотеки убрали и целятся теперь только в 3.14t. Проверять свой код на свободных потоках можно на одной версии, а не на двух.
Что ещё случилось за август, Real Python собрал в месячном дайджесте:
• Python 3.15 выпустил финальную бету;
• команда JIT ответила Steering Council на его ультиматум;
• Astral выкатила ломающие миноры uv и Ruff: перед обновлением стоит заглянуть в changelog;
• MCP пережил крупнейшую переписку с момента появления: сессии выброшены, протокол стал stateless, а FastMCP в Python SDK переименовали.
#cpython
Если вы держите отдельное окружение под сборку без GIL, зоопарк собранных колёс наконец сокращается: поддержку 3.13t крупные научные библиотеки убрали и целятся теперь только в 3.14t. Проверять свой код на свободных потоках можно на одной версии, а не на двух.
Что ещё случилось за август, Real Python собрал в месячном дайджесте:
• Python 3.15 выпустил финальную бету;
• команда JIT ответила Steering Council на его ультиматум;
• Astral выкатила ломающие миноры uv и Ruff: перед обновлением стоит заглянуть в changelog;
• MCP пережил крупнейшую переписку с момента появления: сессии выброшены, протокол стал stateless, а FastMCP в Python SDK переименовали.
#cpython
Forwarded from Представляешь,
Trame v4 добавил управление React-компонентами из Python
При создании приложения на Python-фреймворке trame теперь можно выбрать client_type="react" и сохранить привычные механизмы состояния, событий и триггеров. Связки react.Bind и react.Callback синхронизируют серверную логику с интерфейсом — без отдельного REST API и самописного обмена данными.
Обновление прежде всего пригодится организациям с готовыми React-библиотеками и дизайн-системами: их можно задействовать без полной переделки фронтенда. Но смены фаворита пока нет — Vue.js остаётся стандартным и наиболее полным клиентом, а Kitware не обещает паритета возможностей.
В статье перечислены поддерживаемые на старте компоненты и варианты рендеринга.
При создании приложения на Python-фреймворке trame теперь можно выбрать client_type="react" и сохранить привычные механизмы состояния, событий и триггеров. Связки react.Bind и react.Callback синхронизируют серверную логику с интерфейсом — без отдельного REST API и самописного обмена данными.
Обновление прежде всего пригодится организациям с готовыми React-библиотеками и дизайн-системами: их можно задействовать без полной переделки фронтенда. Но смены фаворита пока нет — Vue.js остаётся стандартным и наиболее полным клиентом, а Kitware не обещает паритета возможностей.
В статье перечислены поддерживаемые на старте компоненты и варианты рендеринга.
Дескриптор может удерживать ваши объекты, но слабые ссылки это исправят
Вы удалили экземпляр, а память не освободилась. Причина может прятаться в дескрипторе: если он записывает проверенные экземпляры в обычный
Если хранить сами экземпляры всё-таки нужно, замените словарь на слабый:
Слабый ключ не мешает сборщику удалить объект, когда на него больше нет сильных ссылок. Питонично: сообщаем, кого видели, но не берём опеку над его временем жизни.
В разборе Memory leakage in Python descriptors есть полный пример утечки и её исправления. Проверьте дескрипторы, которые копят экземпляры после валидации.
Вы удалили экземпляр, а память не освободилась. Причина может прятаться в дескрипторе: если он записывает проверенные экземпляры в обычный
dict, словарь сохраняет сильные ссылки. Сборщик мусора не удалит такие объекты, и утечка будет расти понемногу.Если хранить сами экземпляры всё-таки нужно, замените словарь на слабый:
import weakref
_seen = weakref.WeakKeyDictionary()
Слабый ключ не мешает сборщику удалить объект, когда на него больше нет сильных ссылок. Питонично: сообщаем, кого видели, но не берём опеку над его временем жизни.
В разборе Memory leakage in Python descriptors есть полный пример утечки и её исправления. Проверьте дескрипторы, которые копят экземпляры после валидации.
🔥1
Сотни тысяч корутин лучше не запускать разом
Если запустить всю пачку асинхронных операций сразу, вы нагрузите вызываемые сервисы, а всё необходимое для работы окажется в памяти одновременно. Ограничение конкурентности нужно до того, как очередь съест ресурсы.
Питоничная цель напоминает
В разборе ограничения конкурентности сопоставлены
Если запустить всю пачку асинхронных операций сразу, вы нагрузите вызываемые сервисы, а всё необходимое для работы окажется в памяти одновременно. Ограничение конкурентности нужно до того, как очередь съест ресурсы.
Питоничная цель напоминает
imap_unordered(): одновременно выполнять не больше limit операций и отдавать результаты по мере готовности. asyncio.Semaphore кажется очевидным ответом из Stack Overflow, но автор предупреждает: лучший вариант другой.В разборе ограничения конкурентности сопоставлены
gather(), Semaphore, as_completed(), Queue и wait(). Читайте, чтобы понять, почему автор выбрал wait() и как собрал асинхронный map_unordered() с поддержкой итерируемых объектов и исключений.death and gravity
Limiting concurrency in Python asyncio: the story of async imap_unordered()
So, you're doing some async stuff, repeatedly, hundreds of thousands of times. How do you *not* do it all at once? Hint: asyncio.Semaphore is not always the best way, despite what Stack Overflow may tell you ;)
Внешние ключи Django могут оставить лишние индексы и заблокировать миграцию
В модели всё выглядит аккуратно: несколько
Статья How to Get Foreign Keys Horribly Wrong разбирает, где появляются дублирующие индексы и как обнаружить блокирующую миграцию. Затем переходит к безопасному переносу внешнего ключа, обратимым операциям и конкурентному созданию индексов.
Перед следующим изменением схемы по ссылке стоит проверить ещё две вещи: когда нужен частичный индекс и в каком порядке выполнять миграционные операции.
В модели всё выглядит аккуратно: несколько
ForeignKey, on_delete=PROTECT и unique_together. Но внешний ключ связывает две таблицы, поэтому обеспечить такое ограничение сложнее, чем уникальность или проверку значения. Явное лучше неявного, а неявного поведения здесь хватает.Статья How to Get Foreign Keys Horribly Wrong разбирает, где появляются дублирующие индексы и как обнаружить блокирующую миграцию. Затем переходит к безопасному переносу внешнего ключа, обратимым операциям и конкурентному созданию индексов.
Перед следующим изменением схемы по ссылке стоит проверить ещё две вещи: когда нужен частичный индекс и в каком порядке выполнять миграционные операции.
Hakibenita
How to Get Foreign Keys Horribly Wrong
Common Pitfalls and Potential Optimizations in Django
❤1
Как найти хеш пароля в 37 ГБ меньше чем за миллисекунду
Офлайн-проверка пароля по списку утечек выглядит как обычный поиск, пока Pwned Passwords не распаковывается в текстовый файл на 37 ГБ. Минимальный вариант на Python работает, но оказывается слишком медленным.
Автор профилирует код, пробует пропускать части файла, применяет двоичный поиск, строит отдельный индекс и переводит его в двоичный формат. Вполне по дзену: сначала измерить, потом усложнять. Результат: поиск занимает меньше миллисекунды.
В разборе оптимизации можно проследить, почему первые ускорения не уложились в цель, как генерируется и читается индекс и какие структуры данных автор рассматривает в финале.
Офлайн-проверка пароля по списку утечек выглядит как обычный поиск, пока Pwned Passwords не распаковывается в текстовый файл на 37 ГБ. Минимальный вариант на Python работает, но оказывается слишком медленным.
Автор профилирует код, пробует пропускать части файла, применяет двоичный поиск, строит отдельный индекс и переводит его в двоичный формат. Вполне по дзену: сначала измерить, потом усложнять. Результат: поиск занимает меньше миллисекунды.
В разборе оптимизации можно проследить, почему первые ускорения не уложились в цель, как генерируется и читается индекс и какие структуры данных автор рассматривает в финале.
death and gravity
Has your password been pwned? Or, how I almost failed to search a 37 GB text file in under 1 millisecond (in Python)
... in which we check if your password has been compromised in many inconvenient ways, in a tale of destruction, obsession, and self-discovery.
Как выбрать быстрый способ читать Excel из Python без сюрпризов с типами
Когда в Python нужно разобрать большой XLSX, привычный Pandas оказывается лишь одной из шести опций. Сравнивать их только по секундомеру мало: ещё важны сохранность типов и корректность значений.
Питоничность здесь начинается с контракта: каждая реализация возвращает
В сравнении Haki Benita остались итоговые замеры для Pandas, Tablib, Openpyxl, LibreOffice, DuckDB и Calamine, а также разбор типов и корректности. Полезный ориентир перед тем, как ставить очередную зависимость ради одной таблицы.
Когда в Python нужно разобрать большой XLSX, привычный Pandas оказывается лишь одной из шести опций. Сравнивать их только по секундомеру мало: ещё важны сохранность типов и корректность значений.
Питоничность здесь начинается с контракта: каждая реализация возвращает
Iterator[dict[str, object]], поэтому потребитель может обрабатывать строки по одной. Для теста взяли файл на 25 МБ с 500 тысячами строк, а время измеряли полным проходом без обработки данных.В сравнении Haki Benita остались итоговые замеры для Pandas, Tablib, Openpyxl, LibreOffice, DuckDB и Calamine, а также разбор типов и корректности. Полезный ориентир перед тем, как ставить очередную зависимость ради одной таблицы.
Контекст запроса можно добавить во все логи без ручного extra
В ASGI-приложении запрос заканчивается не там, где начался: обработчик вызывает корутины из других слоёв, и каждая пишет собственные сообщения. Если добавить
Явное лучше неявного, но собирать один и тот же контекст в каждом слое и вручную передавать его дальше — дорогая трактовка PEP 20.
В разборе распространения контекста логов показано, как общие поля попадают в сообщения из разных слоёв ASGI-приложения без ручной передачи по всей цепочке вызовов.
В ASGI-приложении запрос заканчивается не там, где начался: обработчик вызывает корутины из других слоёв, и каждая пишет собственные сообщения. Если добавить
user_id и platform через extra только в обработчике, запись из вложенной функции останется без этих полей.Явное лучше неявного, но собирать один и тот же контекст в каждом слое и вручную передавать его дальше — дорогая трактовка PEP 20.
В разборе распространения контекста логов показано, как общие поля попадают в сообщения из разных слоёв ASGI-приложения без ручной передачи по всей цепочке вызовов.
Сигналы Django подводят в критичных сценариях, но получателей можно выполнять надёжнее
Сигналы Django удобно разрывают зависимости между модулями. В обработке платежа этого мало: способ доставки сигналов остаётся подвержен неожиданным сбоям. Слабая связанность полезна, но надёжность от неё не появляется.
Альтернативный способ запускает получателей как фоновые задачи Django Tasks. В материале решение проверяют на процессе создания платежа и заказа, связывают с транзакциями базы данных, моделируют сбои и отдельно рассматривают атомарность.
В статье Reliable Django Signals остались тесты надёжных сигналов, ограничения подхода и направления дальнейшей работы. Стоит прочитать до того, как доверить сигналам этап процесса, который нельзя потерять из-за неожиданного сбоя.
Сигналы Django удобно разрывают зависимости между модулями. В обработке платежа этого мало: способ доставки сигналов остаётся подвержен неожиданным сбоям. Слабая связанность полезна, но надёжность от неё не появляется.
Альтернативный способ запускает получателей как фоновые задачи Django Tasks. В материале решение проверяют на процессе создания платежа и заказа, связывают с транзакциями базы данных, моделируют сбои и отдельно рассматривают атомарность.
В статье Reliable Django Signals остались тесты надёжных сигналов, ограничения подхода и направления дальнейшей работы. Стоит прочитать до того, как доверить сигналам этап процесса, который нельзя потерять из-за неожиданного сбоя.
Hakibenita
Reliable Django Signals
Using background tasks to reliability execute signal receivers
🔥1
Все дела подождут, потому что сегодня ваш день!
Поздравляем с Днем программиста и желаем меньше багов и больше фич, меньше созвонов и больше фокуса, меньше тасок с пометкой «срочно» и больше времени на отдых.
Забирайте подарок из нашей IT-коробки. Мы уверены, этот презент точно пригодится вам в работе: https://tprg.ru/la2S
Поздравляем с Днем программиста и желаем меньше багов и больше фич, меньше созвонов и больше фокуса, меньше тасок с пометкой «срочно» и больше времени на отдых.
Забирайте подарок из нашей IT-коробки. Мы уверены, этот презент точно пригодится вам в работе: https://tprg.ru/la2S
❤2