如何在不要求任务的情况下完成另一个任务

时间:2019-09-02 17:38:24

标签: python luigi

luigi中,我试图建立一个像这样的工作流程:

1)解析数据

2)对已解析的数据进行计算

3)Tar一起计算数据

这些操作需要按顺序完成,我有几个这样的工作流程。但是,即使需求很容易在1到2之间完成(2要求1),我也不想明确地拥有3需求2,否则我将无法在其他工作流程中重用该任务。那么,我该怎么做?

我知道使用动态依赖项是可行的,但是它的预期用途是用于您不提前知道依赖项列表的情况,而在这种情况下,我可以使用。它还需要我执行一个Workflow任务,该任务按顺序产生任务2和3,而不仅仅是安排它们。

我尝试过的一种可能的解决方案是创建一个可以将任务作为参数的超类,但是不幸的是,这不能正常工作,因为类不能是参数,只能是基元+日期。那么,使这项工作正确的方法是什么?

我将以下当前方法包括在内:

class TaskOne(luigi.Task):
  def output(self):
    return luigi.LocalTarget("...")

  def run(self):
    with self.output().open('w') as out_file:
      // Do parsing

class TaskTwo(luigi.Task):
  def requires(self):
    return TaskOne()

  def output(self):
    return luigi.LocalTarget(".../success.txt")

  def run(self):
    with self.input().open('r') as in_file:
      // Do calculations
    with self.output().open('w') as out_file:
      out_file.write("1")

class TarTask(luigi.Task):
  directory = luigi.Parameter()

  def output(self):
    return luigi.LocalTarget(directory+".tar.xz")

  def run(self):
    // Tar to temporary tar target then mv file to output location

class Workflow(luigi.Task):
  def output(self):
    return luigi.LocalTarget(".../wf_success.txt")

  def run(self):
    yield TaskTwo()
    yield TarTask(directory)
    with self.output().open('w') as out_file:
      out_file.write("1")

1 个答案:

答案 0 :(得分:0)

因此,我想出了一种解决这个问题的方法。您可以像这样动态设置任务实例的require方法:

from types import MethodType


def sequence_tasks(tasks):
    prev_task = None
    for task in tasks:

        def requires_method(self):
            return self.prev_task

        task.requires = MethodType(requires_method, task)
        setattr(task, "prev_task", prev_task)
        prev_task = task
    return prev_task

但是,如果序列中的任务确实需要其他任务,则此方法不起作用。为此,您需要制作一个更复杂的requires_method来调用旧的require并追加/设置一个属性以添加新的需求任务。