Bonobo ETL: как обеспечить глобальный контекст для всех узлов во время выполнения? - PullRequest
0 голосов
/ 06 июня 2019

Какой лучший способ обеспечить какой-то глобальный контекст для всех узлов, скажем, я обрабатываю файл, и у меня есть объект для представления файла, с атрибутами и т. Д., И я хочу иметь возможность получить к нему доступв каждом узле?

1 Ответ

0 голосов
/ 06 июня 2019

Есть много вариантов в зависимости от того, что вы имеете в виду.

Это то, чего вы можете достичь, используя обычные практики разработки программного обеспечения на Python (см. Пример класса ниже).

Первый вариант, если он «глобальный», это использовать глобальную переменную. Хорошо, это не лучшая практика в мире, но я думаю, что это плохо в основном потому, что вы редко хотите глобальное состояние (или вы должны редко хотите его).

Теперь, когда очевидное, вероятно, перечеркнуто, давайте подумаем, что означает «глобальный контекст» в вашем вопросе.

Если это означает что-то «глобальное» для выполнения и определено вне его, вы можете сгруппировать этот объект конфигурации в сервис и внедрить его в узлы, которые в этом нуждаются.

config = {"location": "at joe"}

@use("config")
def choose_a_place_to_eat(config):
    return config["location"]

bonobo.run(..., services={"config": config})

Если это относится к группе узлов, вы также можете сгруппировать эти узлы в классе, роль которого состоит в том, чтобы поддерживать это состояние конфигурации.

class Venue():
    def __init__(self, name):
        self.name = name

    def producer(self):
        return self.name

    def checker(self, name):
        return self.name == name

venue = Venue(name="Joe")
graph = bonobo.Graph(venue.producer, venue.checker, print)
bonobo.run(graph)

или даже (заменяя последнюю часть предыдущего примера) ...

def build_graph(venue):
    return bonobo.Graph(venue.producer, venue.checker, print)

bonobo.run(build_graph(Venue(name="Joe")))

Bonobo внутренне также поддерживает контекст для узлов и графиков, связанных с одним выполнением, и вы можете использовать эти объекты, если вы знакомы с потоками (порядок выполнения не предсказуем, поэтому будьте осторожны с этим). В нескольких выпусках планируется добавить поточно-ориентированные инструменты для этого в контексте выполнения графа.

Эти контексты создаются при запуске выполнения и возвращаются при его завершении.

Надеюсь, что поможет.

...