Исправьте остановку генераторного конвейера Python
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Генераторы Python: задачи на ленивые конвейеры и закрытие ресурсов.
Безопасная остановка конвейера
В системе пакетного анализа строки логов проходят через цепочку генераторов. Входной читатель удерживает открытый файловый дескриптор, а промежуточный узел разбирает записи и вычисляет промежуточные метрики.
При остановке конвейера промежуточный генератор пытается отправить итоговое резюме через yield прямо во время своего завершения. Из-за этого возникает RuntimeError, и штатное закрытие нижележащего читателя срывается: дескриптор так и остаётся незакрытым.
Диспетчеру необходимо надёжно освободить системный ресурс, даже если в промежуточном звене произошёл сбой. Постройте обвязку безопасной остановки конвейера, которая гарантированно закрывает входной дескриптор и возвращает признак успешного освобождения ресурса вместе с возникшим исключением.
Что уже дано
В заготовке объявлена функция close_pipeline(aggregator, reader), которую вам предстоит реализовать.
Что нужно сделать
Реализуйте функцию close_pipeline(aggregator, reader).
Функция принимает два объекта:
aggregator— обёртка над генератором, методclose()которой делегирует вызов генератору и может возбудитьRuntimeError;reader— источник данных, управляющий открытым файлом. Методreader.close()освобождает ресурс и никогда не выбрасывает ошибок на допустимых входах, а свойствоreader.closedвозвращает булево состояние закрытия файла.
При закрытии конвейера соблюдайте следующие правила:
- Обязательно вызовите метод
close()у обоих объектов:aggregatorиreader. Закрывать их можно в любом порядке, но вызовreader.close()должен произойти гарантированно, даже если закрытиеaggregatorзавершилось ошибкой. - Не вычитывайте элементы из
aggregatorилиreader: не вызывайтеnext()и не запускайте обход в цикле. - Функция должна вернуть кортеж из двух элементов
(closed, error): closed(bool) — значение свойстваreader.closedпосле завершения очистки;error(Exception | None) — исходный объект исключения, если закрытиеaggregatorзавершилось ошибкой, либоNone, если агрегатор закрылся без исключений. Заменять или повторно выбрасывать исключение нельзя.
Агрегатор во входных данных может быть как активным (обычным или проблемным), так и ещё не запущенным.
Ввод и вывод
Стандартный ввод stdin не используется. Печатать через print в stdout ничего не нужно: тестирующая система считывает из пространства имён модуля функцию верхнего уровня close_pipeline и вызывает её напрямую в проверяющих сценариях.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- GeneratorExit и yield при close(): вопрос по генераторам Python
- Генераторы Python: синхронизация потоков после фильтрации
- Генераторы Python: разделите поток между двумя потребителями
- Генератор скользящего среднего на Python со сбросом окна
- Генераторы Python: закройте второй источник при ошибке первого
- Фильтрация потока Python: исключения и гарантированное закрытие генератора
