Python 如何使用早期任务';路易吉的产量是多少?
我正在编写一个管道,在这个管道中,后面的任务需要读取前面任务的输出,这样他们就可以知道需要在需求中传递哪些参数 我在下面创建了一个简化的设置示例Python 如何使用早期任务';路易吉的产量是多少?,python,luigi,Python,Luigi,我正在编写一个管道,在这个管道中,后面的任务需要读取前面任务的输出,这样他们就可以知道需要在需求中传递哪些参数 我在下面创建了一个简化的设置示例 import random import pickle import luigi class WriteNumbers(luigi.Task): def requires(self): pass def run(self): # pickle a random list of ints 1-100
import random
import pickle
import luigi
class WriteNumbers(luigi.Task):
def requires(self):
pass
def run(self):
# pickle a random list of ints 1-100
numbers = [random.randint(1, 100) for _ in range(100)]
pickle.dump(numbers, open("./numbers.pkl", 'wb'))
def output(self):
return luigi.LocalTarget("./numbers.pkl")
class SquareNumber(luigi.Task):
number = luigi.IntParameter()
def requires(self):
pass
def run(self):
# given a number as the parameter, write a file containing its square
with open("./squared_{}".format(self.number), 'w') as f:
f.write(str(self.number ** 2))
def output(self):
return luigi.LocalTarget("./squared_{}".format(self.number))
class SquareAll(luigi.WrapperTask):
def requires(self):
yield WriteNumbers() # require the number list to be pickled first
numbers = pickle.load("./numbers.pkl") # load the number list
for n in numbers: # square each number in the number list
yield SquareNumber(number=n)
class CubeNumber(luigi.Task):
number = luigi.IntParameter()
def requires(self):
pass
def run(self):
# given a number as the parameter, write a file containing its cube
with open("./cubed_{}".format(self.number), 'w') as f:
f.write(str(self.number ** 3))
def output(self):
return luigi.LocalTarget("./cubed_{}".format(self.number))
class CubeAll(luigi.WrapperTask):
def requires(self):
yield WriteNumbers() # require the number list to be pickled first
numbers = pickle.load("./numbers.pkl") # load the number list
for n in numbers: # square each number in the number list
yield CubeNumber(number=n)
class CrunchNumbers(luigi.WrapperTask):
def requires(self):
yield SquareAll()
yield CubeAll()
if __name__ == '__main__':
luigi.run()
当通过python luigi_example.py CrunchNumbers运行时,将创建100个随机数,并将列表pickle并转储到磁盘SquareAll
加载该pickle列表,并使用它要求具有所需参数的SquareNumber
任务CubeAll
为其类似任务引用相同的结果文件
问题是,运行时将引发异常,因为numbers.pkl
文件尚不存在
如何允许以后的任务根据以前任务的输出生成依赖关系?我在这里使用了随机数来表示不能提前知道输出:我的实际应用程序正在处理来自API的数据。您正在使用的,需要从运行
方法调用这些数据(当requires
的结果作为输入可用时),所以CubeAll
和SquareAll
的结构应该如下:
class SquareAll(luigi.WrapperTask):
def requires(self):
yield WriteNumbers() # require the number list to be pickled first
def run(self):
numbers_file = self.input()[0].path
numbers = pickle.load(numbers_file) # load the number list
for n in numbers: # square each number in the number list
yield SquareNumber(number=n)
我认为您应该尝试在luigi
文档中查找,看看任务之间是否实现了任何通信,返回数据或对象的任何方式,因为使用文件不是最好的方式。CubeNumber/SquareNumber是否真的需要成为任务?为什么不让cubenumber和SquareNumbers作为run方法的任务呢?