Python 3.14.7: безопасная граница pickle при конкурентном изменении списка. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Что именно проверяется
В этом изменении нет универсального обещания. Официальная запись говорит: В free-threaded mode исправлен потенциальный use-after-free в pickle.dumps() при сериализации lists. Проверяемый пользовательский риск сформулирован так: Один поток сериализует список, другой меняет его состав, и прежняя реализация free-threaded build могла обращаться к уже освобождённой памяти. Если ваш случай не укладывается в «как проверить pickle.dumps списка при конкурентной мутации в free-threaded Python 3.14.7», новый Python может ничего не изменить. Сначала сохраните baseline и заранее решите, какое наблюдение подтвердит границу, а какое отправит расследование в другую ветку.
Минимальный target-case
Минимальный case T22-08: в отдельном процессе сериализовать короткий список уникальных immutable-маркеров, синхронизировав одну bounded мутацию через Event и watchdog. Зафиксируйте вход один раз и используйте его неизменным для всех веток. Рискованный вызов изолируйте, внешнюю сеть запретите, выход child считайте таким же результатом, как return value. Любой ручной workaround применяйте только после baseline, иначе нельзя понять, что именно изменило поведение.
Как разрушить гипотезу
Контроль специально должен разрушать гипотезу: снять стабильный pickle неизменяемого списка, затем повторить сериализацию с внешним lock и лишь после этого включить одну конкурентную операцию. Для каждого запуска заполните «build mode | protocol | исходный состав | mutation kind | exit code | pickle load status | состав восстановленного объекта». Один и тот же объект между ветками не переиспользуется. Если целевой результат появляется и без исправляемого условия, причина находится выше по стеку; если падают обе ветки, сначала чините fixture и только потом версию runtime.
Passed, blocked или failed
Критерий принятия: процесс не падает и не зависает; полученный stream либо корректно загружается в допустимое состояние, либо операция завершается документированным исключением. Красной считается не только авария, но и потеря данных, лишний побочный эффект, неподтверждённая capability или загрязнённый repeat. Результат относится к одной issue и одному build mode. Он не гарантирует работу проекта, индексацию страницы или отсутствие иных дефектов.
Безопасная граница опыта
Безопасная граница: не распаковывать недоверенный pickle и не устраивать длительный fuzz; любой crash, timeout или неограниченный рост — красная ветка. Любой выход за неё делает данные непригодными. Не прикладывайте core dump, домашние пути, hostnames, адреса памяти и содержимое рабочих файлов. После завершения сравните process/file inventory с baseline; отличие требует ручной очистки до следующего запуска.
Пакет эскалации
Пакет эскалации: флаг free-threaded, protocol, хэши входного и восстановленного состава, тип мутации, exit code и stderr без бинарного pickle. Укажите, совпали ли A и A2, и какой expected result использовался: «процесс не падает и не зависает; полученный stream либо корректно загружается в допустимое состояние, либо операция завершается документированным исключением». В issue не нужны пользовательские данные или доказательство популярности. Нужны минимальный input, версия, capability и наблюдаемый переход.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #149816 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.