Python 3.14.7: asyncio больше не сигналит процессу с повторно выданным PID. Практическая проверка отделяет симптом от соседних причин: безопасный fixture, опровергающий control, измеримая развилка, стоп-линия и минимальный пакет для поддержки.
Короткий ответ и граница
Запрос ограничен формулировкой «как проверить гонку asyncio subprocess при повторном использовании PID в Python 3.14.7». Наблюдаемый симптом: запоздалый terminate или kill для уже reaped child теоретически попадает в другой процесс, которому ОС успела выдать тот же PID. Официально подтверждена более узкая граница: на Unix устранена гонка, при которой send_signal, terminate или kill могли послать сигнал постороннему процессу с повторно использованным PID при ThreadedChildWatcher. Это не означает, что любой похожий crash, warning, hang или неверный результат вызван именно этой ошибкой. Сначала запишите точную версию Python, режим сборки, платформу и один ожидаемый переход состояния; обновление всей среды не должно быть первым действием.
Проверка без риска
Для паспорта T21-06 выполните только такой опыт: использовать изолированный PID namespace, завершить первый child, дождаться его reap и вызвать terminate на сохранённом Process object, отслеживая только второй marker-процесс внутри namespace. Входы должны быть синтетическими, а рискованный код — жить в отдельном child process, контейнере, pty или temp root. До запуска задайте deadline, лимит памяти и допустимые файлы. Не используйте реальные архивы, токены, адреса, пользовательские документы или production PID. Если нужный backend, libc, compiler или GUI недоступен, зафиксируйте environment blocker: это честнее, чем имитировать результат.
Контроль и таблица
Опровергающая ветка: сигнал живому первому child до reap и повторный вызов после reap без запуска второго marker-процесса. Наблюдения пишутся строго как «этап lifecycle | PID первого и marker | watcher | вызов API | состояние marker | exception». Сначала выполните control A, затем проблемный case B, полностью пересоздайте fixture и повторите A2. Если A2 расходится с A, опыт загрязнён cache, locale, descriptor, signal state или environment. Пустая ячейка не равна нулю, а текст exception не заменяет его класс. Такое разделение не позволяет объявить исправление только потому, что один запуск случайно не упал.
Как принять решение
Зелёная ветка разрешена только когда живой child получает ожидаемый сигнал, но после reap никакой новый marker-процесс не меняет состояние. Если оба варианта ведут себя одинаково плохо, чините fixture, а не Python. Если control чист, но симптом не воспроизводится, итог — not reproduced в конкретной конфигурации, не доказательство отсутствия дефекта вообще. Сравнение 3.14.6 и 3.14.7 допустимо лишь с одинаковым input и limits. Результат относится к issue-boundary, а не к скорости, безопасности или совместимости всего приложения.
Стоп и возврат
Стоп-линия: не пытаться ускорять reuse PID на хосте и прекратить тест, если namespace или cgroup недоступны. Остановитесь также при записи вне temp root, внешнем сетевом запросе, появлении приватных данных, неконтролируемом descendant process или превышении deadline. Не получайте зелёный статус отключением проверок, catch-all обработчиком, бесконечным retry или повышением лимитов после сбоя. Возврат должен быть проверяемым: удалить namespace, дождаться всех child и проверить отсутствие процессов из тестовой cgroup. После этого ещё раз снимите process/file inventory и убедитесь, что состояние совпало с baseline.
Пакет для поддержки
Для issue #127049 достаточно передать: Unix variant, watcher, последовательность reap/signal, обезличенные PID labels, exit states и asyncio debug log. Добавьте московский timestamp, labels A/B/A2 и точный критерий «{topic['green']}». Абсолютные пути, PIDs, hostnames, environment dumps, core dumps и содержимое рабочих файлов удалите или замените метками. Официальные источники подтверждают изменение «{topic['boundary']}», но не популярность запроса, позиции в поиске или готовность вашей системы. Такой пакет позволяет повторить один переход без доступа к инфраструктуре.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #127049 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.