Python 3.14.7: почему сломанный ProcessPool должен давать разные traceback. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Факт, который можно опровергнуть
Начните с вопроса, который можно опровергнуть: «как проверить отдельный BrokenProcessPool для каждого Future в Python 3.14.7». Changelog подтверждает узкую change boundary: ProcessPoolExecutor теперь назначает отдельный BrokenProcessPool каждому pending Future вместо общего экземпляра. Она связана с конкретной болью — После внезапной остановки worker несколько Future разделяли один объект исключения, и каждый result() дописывал к нему traceback, превращая диагностический отчёт в повторяющуюся цепочку. — но не подтверждает частоту встречаемости. Поэтому ниже есть чистый fixture, противоположный control и стоп-линия; без них отсутствие crash или один удачный запуск остаются слабым наблюдением.
Карточка воспроизведения
Запишите карточку опыта T22-05: точная версия, режим запуска, короткий hash входа и действие «в child-runner создать два pending Future и один тестовый worker, который завершится с заранее заданным ненулевым кодом до выполнения задач». Используйте только обратимые ресурсы. До выполнения определите, где появятся stdout, stderr и exit code, а также как будет выполнена очистка. Так диагностический пакет останется повторяемым и не потребует доступа к реальной инфраструктуре.
Control перед выводом
Отрицательный control обязателен: сравнить id исключений, длину traceback и порядок кадров для двух Future, затем повторить весь executor в новом процессе. Заполняйте «future label | exception class | object identity | число кадров | повторяющиеся кадры | worker exit code | executor shutdown» до интерпретации вывода. Если результат зависит от порядка, поменяйте порядок и начните заново с чистого fixture. Не объединяйте несколько исправлений в одном опыте: иначе невозможно связать наблюдение с issue boundary.
Формальное условие приёмки
Формальное условие passed: каждый Future имеет самостоятельный объект BrokenProcessPool и конечный traceback без накопления кадров от чтения соседнего Future. Один позитивный запуск недостаточен — повтор должен сохранить тот же контракт. При расходящихся результатах снизьте вывод до inconclusive и проверьте происхождение бинарника, feature flags и чистоту input. Не повышайте уверенность количеством одинаковых перезапусков одного загрязнённого процесса.
Предел вмешательства
Предел вмешательства: не завершать production worker и не посылать сигналы чужим PID; тест ограничен дочерним executor и deadline. Нельзя расширять тест на production, чужие PID или реальные данные. После target удалите fixture, закройте локальные endpoints и повторите маленький baseline control. Только совпавший baseline доказывает, что эксперимент не оставил состояние.
Сокращённый support bundle
Сокращённый support bundle содержит: версия Python, число Future, безопасный способ завершения тестового worker, таблица identity/frames и финальный shutdown state. Свяжите его с T22-05, добавьте hash синтетического input и критерий «каждый Future имеет самостоятельный объект BrokenProcessPool и конечный traceback без накопления кадров от чтения соседнего Future». Абсолютные пути замените ролями, бинарные данные — hashes, сообщения с приватным контекстом — классами исключений.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #101267 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.