Как запустить конвейер, если каждый раз меняются требования задачи?
У меня есть конвейер: 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.