Практическая проверка Python 3.15 RC1: как проверить TaskGroup.cancel Python 3.15 чтобы задачи завершили finally и группа не оставила фоновых task. Изолированный fixture, отрицательный контроль, заранее заданный критерий и безопасный пакет диагностики.
Отмена группы и завершение задачи
Python 3.15 добавляет TaskGroup.cancel() для ранней остановки группы без служебной задачи, специально поднимающей пользовательское исключение. Это подтверждает только границу функции, а не наличие проблемы в конкретном проекте. Практический симптом уже: Сервис достиг результата или получил stop-сигнал, но ручная отмена списка задач пропускает одну task, а подавленный CancelledError оставляет незакрытый ресурс. До изменения кода зафиксируйте версию runtime, способ установки, один ожидаемый результат и один отрицательный исход. RC1 остаётся предварительным выпуском: его проверяют в отдельной среде, не ставят поверх рабочего interpreter и не используют один удачный запуск как разрешение на migration.
Barrier делает порядок наблюдаемым
Рекомендуемый fixture: создать три корутины: ожидающую Event, завершающуюся нормально и записывающую finally marker; вызвать cancel() после barrier, затем выйти из async with под deadline. Дайте ему метку T23-12, отдельный temp root и короткий deadline. Входы должны быть синтетическими, повторяемыми и минимальными; каждый новый запуск получает новые объекты и процесс, если cache или global state способны изменить наблюдение. До опыта запишите точную команду и ожидаемый class результата. Не включайте рабочие конфиги, адреса, токены, персональные строки, production PID или полные environment dumps.
Нормальный, cancel и повторный cancel
Опровергающий маршрут: сравнить нормальный выход без cancel, cancel после barrier и повторный cancel; после контекста проверить all_tasks только для созданных labels, не чужие задачи loop. Собирайте строки формата «сценарий | task started | cancel requested | finally marker | task done | исключение группы | pending labels». Порядок control A, target B, fresh control A2 обнаруживает загрязнение fixture: если A2 расходится с A, итог нельзя помечать passed. Пустое поле не равно нулю, отсутствие exception не доказывает правильную семантику, а изменение двух параметров сразу лишает опыт диагностической силы. Соседние причины получают отдельные строки, а не удобное общее объяснение.
Finally и отсутствие pending labels
Зелёный критерий сформулирован заранее: каждая запущенная fixture-task проходит finally, контекст завершается за deadline и не остаётся pending label; нормальная задача не классифицируется как потерянная. Ветка not reproduced означает только отсутствие симптома в этой версии fixture; blocked означает нехватку capability или источника; failed control возвращает расследование к стенду. Стоп-линия: {item['stop']}. Нельзя добиваться зелёного результата отключением проверки, broad except, ростом лимита, повторением до случайного успеха или подменой предварительного release стабильным обещанием. После теста удаляются только созданные temp-ресурсы.
Что не скрывать в ExceptionGroup
Для maintainer или поддержки подготовьте: минимальный asyncio.run, barrier order, labels, task states и traceback ExceptionGroup без URL, токенов и сетевых запросов. Добавьте label T23-12, московский timestamp, точную версию RC и формулировку критерия «каждая запущенная fixture-task проходит finally, контекст завершается за deadline и не остаётся pending label; нормальная задача не классифицируется как потерянная». Секреты, IP, hostnames, usernames, абсолютные домашние пути и полные логи удалите. Официальные источники подтверждают изменение «Python 3.15 добавляет TaskGroup.cancel() для ранней остановки группы без служебной задачи, специально поднимающей пользовательское исключение.», но не подтверждают результат вашего теста, частоту проблемы или необходимость менять production. Такой пакет позволяет воспроизвести одну ветку, не раскрывая данные и не смешивая её с соседними issues.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.15.0rc1 release проверено 2026-08-29
- What’s New in Python 3.15 проверено 2026-08-29
- CPython change #127214 for TaskGroup.cancel проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.