Ресурсы companion на Python
Ресурс companion хранит объект, общий для джобов одного процесса Python: например, клиент или справочные данные. Flow создаёт его с помощью зарегистрированной фабрики и управляет жизненным циклом. У каждого процесса companion свои экземпляры, в том числе при запуске нескольких интерпретаторов.
Используйте этот API после настройки Python companion. Прокси на воркере, зависимости ресурсов и привязки компьютейшена описаны в разделе Подключение ресурсов companion.
Регистрация класса ресурса
Реализуйте FlowResource из yt.yt.flow.library.python.companion и зарегистрируйте его в Pipeline до вызова pipeline.run():
pipeline.add_resource(resource_class)использует класс как фабрику без аргументов.pipeline.add_resource(resource_class, factory)использует вашу фабрику без аргументов и имя, полученное из класса.pipeline.add_resource(name, factory)регистрирует явно заданное имя реализации; фабрика обязательна.
При каждом вызове фабрика должна возвращать новый экземпляр FlowResource. У разных идентификаторов ресурсов и у заменяющих экземпляров независимые жизненные циклы. Регистрация фабрики не загружает ресурс.
При регистрации по классу именем реализации служит непустой атрибут flow_resource_class, заданный в самом классе, или полное имя module.qualname. Атрибут не наследуется от базового класса. Укажите это имя в parameters.companion_resource_class; оно отличается от идентификатора ресурса и псевдонима в компьютейшене. Повторная регистрация одного имени отклоняется.
В поддерживаемом тестовом companion показаны именование по классу, явное имя, зависимость и чтение ресурса из компьютейшена. Соответствующие привязки заданы в спецификации пайплайна.
Жизненный цикл и контекст
Переопределите нужные методы ресурса. Аргумент ResourceContext передаёт текущую конфигурацию и инициализированные зависимости.
|
Метод |
Назначение |
|
|
Инициализирует новый экземпляр по статическим и динамическим параметрам и зависимостям. Оставьте конструктор лёгким, а инициализацию ресурса выполняйте здесь. |
|
|
Применяет изменённые динамические параметры к работающему экземпляру. По умолчанию ничего не меняет. Новые значения нужно читать из аргумента. |
|
|
Освобождает удерживаемые объекты и внешние ресурсы. Очистка должна работать и после частично выполненного |
context.resource_id — идентификатор из spec.resources. Словарь context.parameters содержит статические параметры ресурса, включая companion_resource_class, а context.dynamic_parameters — динамические параметры. Словарь context.dependencies сопоставляет псевдоним зависимости с её инициализированным FlowResource; если псевдоним не задан, ключом служит идентификатор зависимости. Зависимости удерживаются всё время жизни зависимого экземпляра.
Контекст также предоставляет общие для процесса http_client и https_client; см. HTTP-клиенты.
Чтение ресурса из пользовательского кода
В обработчике вызовите ctx.get_resource(alias), где ctx — контекст выполнения. Добавьте ресурс в required_resource_ids компьютейшена. Для поиска используется alias из этого требования, а если псевдоним не задан — идентификатор ресурса. Отсутствие привязки вызывает ValueError.
Получайте ресурс заново для каждого батча. Не сохраняйте экземпляр в компьютейшене или глобальной переменной между батчами: Flow может вывести его из использования и выполнить очистку до обращения из следующего батча.
Конкурентный доступ и ошибки
Один экземпляр может одновременно обслуживать несколько джобов и потоков. Синхронизируйте доступ к изменяемым данным внутри ресурса. Пока выполняется reconfigure, новые обращения за экземпляром отклоняются, но батчи и зависимые ресурсы, уже получившие его, могут продолжать работу. Удержание ресурса батчем откладывает очистку; оно не синхронизирует изменения и не создаёт снапшот конфигурации.
Если load завершился ошибкой после создания экземпляра, Flow пытается вызвать unload для частично инициализированного объекта. После ошибки reconfigure экземпляр перестаёт быть доступен новым потребителям; при последующей успешной инициализации создаётся новый. Очистка ждёт освобождения уже выданных ссылок. Исключение типа Exception из unload записывается в лог и подавляется; другие подклассы BaseException передаются вызывающему коду.
Воркер повторяет инициализацию согласно настройкам прокси. Предусмотрите повторную инициализацию и освобождение частично полученных объектов в unload. Управление жизненным циклом ресурса не делает внешние эффекты транзакционными.
Исходный код и тесты
- Публичный API регистрации и тесты регистрации.
- Реализация жизненного цикла и тесты хранилища ресурсов: доступ из обработчиков, устаревшие ссылки батчей и отложенная очистка.
- Интеграционный тест ресурсов: общий сценарий проверяет значения зависимостей, динамические обновления и восстановление после перезапуска companion.