1

为所有节点提供某种全局上下文的最佳方法是什么,比如说我正在处理一个文件,我有一个对象来表示文件,带有属性等,我希望能够在每个节点中访问它?

4

1 回答 1

1

有很多选择取决于你的意思。

这是您可以使用常规的 Python 软件开发实践来实现的(参见下面的类示例)。

第一个选项,如果它是«global»,是使用全局变量。好吧,这不是世界上最好的做法,但我认为这很糟糕,主要是因为你很少需要一个全局状态(或者你应该很少需要它)。

现在显而易见的可能已被删除,让我们考虑一下您的问题中的“全局上下文”是什么意思。

如果它对执行意味着“全局”,并在其外部定义,则可以将此配置对象分组到服务中并将其注入需要它的节点中。

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 在内部还保留了与一次执行相关的节点和图形的上下文,如果您熟悉线程,则可以使用这些对象(执行顺序不可预测,因此请注意这一点)。从现在开始有几个版本计划在图形执行上下文中为此添加线程安全工具。

这些上下文在执行开始时创建,并在执行完成时返回。

希望有所帮助。

于 2019-06-06T14:04:10.727 回答