gpt4 book ai didi

python - 在 run() 中产生任务时 Luigi 中的 TaskClassAmbigiousException

转载 作者:行者123 更新时间:2023-12-05 06:53:18 41 4
gpt4 key购买 nike

我正在为 Luigi 中一个我不理解的错误而苦苦挣扎。我不知道这是一个已知问题、Luigi 的限制还是我做错了什么。

我在一个有很多任务和很多依赖的真实问题中使用 Luigi。但是,我做了一个玩具示例,其中清楚地显示了这个问题。

让我们考虑两个任务,TaskA 和 TaskB,TaskA 需要执行具有不同 Luigi 参数值的 TaskB 的两个先前实例。

如果我在 TaksA 的 requires() 方法中编写依赖项,则不会发生任何不良情况。所有三个任务都执行,并且我写入了退出文件。

但是如果我在 TaksA 的 run() 方法中编写依赖项,那么我会得到丑陋的 TaskClassAmbigiousException。

在我的实际问题中,我无法在 requires() 方法中产生任务,因为我需要知道在 requieres() 方法中也产生的先前任务的结果,所以我尝试在中产生任务run() 并得到相同的异常。

好的,这是玩具示例的代码。首先,在 requieres() 中生成任务,它起作用了:

import luigi

class TaskB(luigi.Task):
j = luigi.IntParameter(default=1)

def output(self):
return luigi.LocalTarget("data/outputB{j}.txt".format(j=self.j))

def requires(self):
pass

def run(self):
print_file = 'TaskB' + str(self.j)

with self.output().open('w') as out_file:
out_file.write(print_file)

class TaskA(luigi.Task):
i = luigi.IntParameter(default=1)

def output(self):
return luigi.LocalTarget("data/outputA{i}.txt".format(i=self.i))

def requires(self):
yield TaskB(j=self.i)
yield TaskB(j=self.i+1)

def run(self):
print_file = ""
for input_target in self.input():
with input_target.open('r') as in_file:
for line in in_file:
print_file+=line + 'TaskA' + str(self.i)

with self.output().open('w') as out_file:
out_file.write(print_file)

if __name__ == '__main__':
taskA = TaskA(i=2)

其次,在 run() 中产生任务,我得到了这个:

 File "/home/ppo0011l/.conda/envs/nudge/lib/python3.6/site-packages/luigi/worker.py", line 1081, in _handle_next_task
for module, name, params in new_requirements]

File "/home/ppo0011l/.conda/envs/nudge/lib/python3.6/site-packages/luigi/worker.py", line 1081, in <listcomp>
for module, name, params in new_requirements]

File "/home/ppo0011l/.conda/envs/nudge/lib/python3.6/site-packages/luigi/task_register.py", line 251, in load_task
task_cls = Register.get_task_cls(task_name)

File "/home/ppo0011l/.conda/envs/nudge/lib/python3.6/site-packages/luigi/task_register.py", line 181, in get_task_cls
raise TaskClassAmbigiousException('Task %r is ambiguous' % name)

代码:

import luigi

class TaskB(luigi.Task):
j = luigi.IntParameter(default=1)

def output(self):
return luigi.LocalTarget("data/outputB{j}.txt".format(j=self.j))

def requires(self):
pass

def run(self):
print_file = 'TaskB' + str(self.j)

with self.output().open('w') as out_file:
out_file.write(print_file)

class TaskA(luigi.Task):
i = luigi.IntParameter(default=1)

def output(self):
return luigi.LocalTarget("data/outputA{i}.txt".format(i=self.i))

def requires(self):
pass

def run(self):
print_file = ""
target1 = yield TaskB(j=self.i)
target2 = yield TaskB(j=self.i+1)
for input_target in [target1, target2]:
with input_target.open('r') as in_file:
for line in in_file:
print_file+=line + 'TaskA' + str(self.i)

with self.output().open('w') as out_file:
out_file.write(print_file)

if __name__ == '__main__':
taskA = TaskA(i=2)
luigi.build([taskA], workers=1,local_scheduler=True,log_level='WARNING')

编辑:我编辑以添加另一个相关问题。因为我想做的是产生一个任务,其参数取决于先前产生的任务,如果这对我来说可能就足够了:

  def requires(self):
taskb_target = yield TaskB(j=self.i)
taskb_target.open('r')
# do something and yield next Task depending on what taskb_target has
yield TaskB(j=self.i+1)

但不幸的是,这不起作用。 Luigi 说“NoneType”对象没有属性“open”。

但是,当您在 run() 方法中生成任务时,您可以在运行时访问输出。好像有很大的不对称...

第二次编辑:

我做了更多的试验,我发现了一个奇怪的结论:我在原始问题中编写的第二段代码(当在 .py 文件中时)可以永远执行,即使删除输出文件和所以迫使 luigi 重新执行任务。但是,第一段代码只能执行一次(然后,在第一次执行时,它就起作用了!!)。但是如果删除文件再执行代码,就会出现ambiguous task错误。

我觉得跟luigi的Register对象有关系。但真正让我感到困惑的是,无论我是在 requieres 中还是在 run 方法中产生 taskB,这种行为都是不同的。

我仍然不知道问题是否出现在重新定义已经在 luigi 的 Register 模块中的类 Tasks 时。可能是...我还尝试将类定义放在与主 .py 不同的 .py 中,但是运行两次时它会中断。正常运行的唯一方法是重新启动内核,你只有一次机会!

最佳答案

当您使用 yield 时,您不会获得返回值,因为您基本上是从协程中返回一个值。我真的很惊讶在 requires 中使用 yield 对你有用,因为它让我崩溃了。您要做的是先定义然后 yield 任务。因此,例如,您将拥有:

class TaskA(luigi.Task):
def run(self):
task_1 = TaskB(j=self.i)
yield task_1
with task_1.output().open('r') as in_file:
# Get data

task_2 = TaskB(j=self.i+1, ...)
yield task_2
...

关于python - 在 run() 中产生任务时 Luigi 中的 TaskClassAmbigiousException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65803757/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com