如何使用上游任务的输出来驱动require()的结果?

时间:2019-10-30 22:08:05

标签: luigi

在Luigi中,我有一个任务要根据另一个上游任务的输出动态生成依赖项列表。例如:

class TaskA:
  param = IntParameter()

class TaskB:
  def main(self):
    pass
  def output(self):
    return [1,2,3,4]

class TaskC:
  def requires(self):
    return [TaskB()] + [TaskA(param=p) for p in TaskB().output()]

总而言之,我将根据TaskB的输出在TaskC中创建一组TaskA依赖项。

我尝试了一些事情,但是Luigi似乎很困惑,因为TaskB确实需要在TaskC返回其依赖项列表之前运行。但是很明显,路易吉在调用TaskC.requires()

之前无法运行任何东西

有什么办法可以使这项工作完成我在这里想要做的事情吗?

在我的现实生活中,这些任务的实现要复杂得多,但这是任务之间如何连接的要旨。

1 个答案:

答案 0 :(得分:1)

这是一个很好的问题! Luigi实际上为此提供了完美的解决方案,并且在文档中对此进行了介绍:https://luigi.readthedocs.io/en/stable/tasks.html#dynamic-dependencies

基本上,根据输出,您将需要TaskB,然后yieldrun函数中的新任务上。让我向您展示一个示例:

class TaskC:
  def requires(self):
    return TaskB()

  def run(self):
    yield [TaskA(param=p) for p in self.input()]