Как запустить конвейер, если каждый раз меняются требования задачи?

У меня есть конвейер: F -> M -> S. Где F, M и S - задачи. Я вызываю Луиджи с задачей S. Задача S требует M; и M требует F. Но иногда M требует D, в других случаях требуется B. F, D и B различны, ничем не похожи, но выходные данные всех этих задач могут использоваться M. Сегодня у нас есть 3 варианта, но со временем это число будет расти. Должен ли я менять все задачи каждый раз, когда в конвейер добавляется новая задача в качестве опции (например, теперь у нас есть код для задачи E, который иногда потребуется M, а иногда нет), или может Я передаю задание в качестве параметра (как?)?

1 ответ

То, что вы хотите, вероятно, динамическая зависимость в Луиджи. Я хотел бы что-то вроде этого

class M(luigi.Task):
  def requires(self):
        # keep empty() or add any dependency which are not dynamically required

  def run(self):
      # Collect condition for each of the dynamic dependencies
      if(condition_for_task_F):
          s=yield TaskF()
      elif....
      else:
          s= yield TaskE()

И чтобы ответить на ваш вопрос, можете ли вы передать задачу в качестве параметра. Ответ может быть возможным с этим. Но это должно быть абсолютно запрещено, поскольку это нарушает принцип идемпотентности. Это плохое программирование. лучший способ - отделить логику зависимости от другой задачи, подобной этой.

 F,D,B,E -> Y -> M -> S 

где Y просто вычисляет зависимости и переносит их в M.

Другие вопросы по тегам