---
metadata:
  - name: generator
    content: Diplodoc Platform v5.64.2
alternate:
  - https://ytsaurus.tech/docs/en/flow/python/resources.md
  - https://ytsaurus.tech/docs/ru/flow/python/resources.md
  - href: https://ytsaurus.tech/docs/ru/flow/python/resources.md
    type: text/markdown
    title: Markdown version
  - href: https://ytsaurus.tech/docs/ru/llms.txt?revision=827ae6f9747f49afc4a4326edf00597a1e92428f
    rel: describedby
---
> **Documentation Index:** Fetch the complete configuration index at https://ytsaurus.tech/docs/ru/llms.txt?revision=827ae6f9747f49afc4a4326edf00597a1e92428f

# Ресурсы companion на Python

Ресурс companion хранит объект, общий для джобов одного процесса Python: например, клиент или справочные данные. Flow создаёт его с помощью зарегистрированной фабрики и управляет жизненным циклом. У каждого процесса companion свои экземпляры, в том числе при [запуске нескольких интерпретаторов](https://ytsaurus.tech/docs/ru/flow/python/getting-started.md#companion-process-count).

Используйте этот API после настройки [Python companion](https://ytsaurus.tech/docs/ru/flow/python/getting-started.md). Прокси на воркере, зависимости ресурсов и привязки компьютейшена описаны в разделе [Подключение ресурсов companion](https://ytsaurus.tech/docs/ru/flow/concepts/companion.md#companion-resources).

## Регистрация класса ресурса {#registration}

Реализуйте `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](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/tests/companion/resource/python/pipeline/__main__.py) показаны именование по классу, явное имя, зависимость и чтение ресурса из компьютейшена. Соответствующие привязки заданы в [спецификации пайплайна](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/tests/companion/resource/python/pipeline.yson).

## Жизненный цикл и контекст {#lifecycle}

Переопределите нужные методы ресурса. Аргумент `ResourceContext` передаёт текущую конфигурацию и инициализированные зависимости.

#|
|| **Метод** | **Назначение** ||
|| `load(context)` | Инициализирует новый экземпляр по статическим и динамическим параметрам и зависимостям. Оставьте конструктор лёгким, а инициализацию ресурса выполняйте здесь. ||
|| `reconfigure(context)` | Применяет изменённые динамические параметры к работающему экземпляру. По умолчанию ничего не меняет. Новые значения нужно читать из аргумента. ||
|| `unload()` | Освобождает удерживаемые объекты и внешние ресурсы. Очистка должна работать и после частично выполненного `load`. ||
|#

`context.resource_id` — идентификатор из `spec.resources`. Словарь `context.parameters` содержит статические параметры ресурса, включая `companion_resource_class`, а `context.dynamic_parameters` — динамические параметры. Словарь `context.dependencies` сопоставляет псевдоним зависимости с её инициализированным `FlowResource`; если псевдоним не задан, ключом служит идентификатор зависимости. Зависимости удерживаются всё время жизни зависимого экземпляра.

Контекст также предоставляет общие для процесса `http_client` и `https_client`; см. [HTTP-клиенты](https://ytsaurus.tech/docs/ru/flow/python/http-client.md).

## Чтение ресурса из пользовательского кода {#access}

В обработчике вызовите `ctx.get_resource(alias)`, где `ctx` — контекст выполнения. Добавьте ресурс в `required_resource_ids` компьютейшена. Для поиска используется `alias` из этого требования, а если псевдоним не задан — идентификатор ресурса. Отсутствие привязки вызывает `ValueError`.

Получайте ресурс заново для каждого батча. Не сохраняйте экземпляр в компьютейшене или глобальной переменной между батчами: Flow может вывести его из использования и выполнить очистку до обращения из следующего батча.

## Конкурентный доступ и ошибки {#concurrency-and-failures}

Один экземпляр может одновременно обслуживать несколько джобов и потоков. Синхронизируйте доступ к изменяемым данным внутри ресурса. Пока выполняется `reconfigure`, новые обращения за экземпляром отклоняются, но батчи и зависимые ресурсы, уже получившие его, могут продолжать работу. Удержание ресурса батчем откладывает очистку; оно не синхронизирует изменения и не создаёт снапшот конфигурации.

Если `load` завершился ошибкой после создания экземпляра, Flow пытается вызвать `unload` для частично инициализированного объекта. После ошибки `reconfigure` экземпляр перестаёт быть доступен новым потребителям; при последующей успешной инициализации создаётся новый. Очистка ждёт освобождения уже выданных ссылок. Исключение типа `Exception` из `unload` записывается в лог и подавляется; другие подклассы `BaseException` передаются вызывающему коду.

Воркер повторяет инициализацию согласно [настройкам прокси](https://ytsaurus.tech/docs/ru/flow/concepts/companion.md#companion-resource-failures). Предусмотрите повторную инициализацию и освобождение частично полученных объектов в `unload`. Управление жизненным циклом ресурса не делает внешние эффекты транзакционными.

## Исходный код и тесты {#source-and-tests}

- [Публичный API регистрации](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/_api.py) и [тесты регистрации](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/test/test_api.py).
- [Реализация жизненного цикла](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/resource.py) и [тесты хранилища ресурсов](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/test/test_resource_store.py): доступ из обработчиков, устаревшие ссылки батчей и отложенная очистка.
- [Интеграционный тест ресурсов](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/tests/companion/resource/python/test_resource.py): общий сценарий проверяет значения зависимостей, динамические обновления и восстановление после перезапуска companion.
