Kal*_*hon 10 python luigi python-3.6
我使用Spotify的Luigi在Python 3.6中编写了我的第一个项目,以便在管道中安排一些自然语言处理任务.
我注意到类的output()功能Task总是返回某种Target对象,这只是某个文件,无论是本地还是远程.因为我的任务产生了更复杂的数据结构,比如解析树,所以将它们作为字符串写入文件并在之后再次读取它是非常尴尬的.
因此,我想询问是否有可能在管道中的任务之间传递Python对象?
mat*_*gus 14
简答:不.
Luigi参数仅限于date/datetime对象,string,int和float.请参阅文档以供参考.
这意味着您需要将复杂数据结构序列化为字符串(使用json,msgpack,您喜欢的任何序列化程序,甚至压缩它)并将其作为字符串参数传递.
当然,您可以编写自定义Parameter子类,但是您需要基本实现serialize和parse方法.
但是要考虑:如果您使用参数而不是将计算数据保存到目标,那么您将失去使用Luigi的一个关键优势:如果树中的父任务失败超过您指定的重试次数,那么您我需要运行再次计算复杂数据结构的任务.如果您的任务计算复杂数据或花费大量时间或消耗大量资源,那么您应该将输出保存为目标,以便不必再次执行所有昂贵的计算.
并且展望未来:另一项任务可能也需要这些数据,为什么不保存呢?
另外,请注意目标不仅是文件:您可以将数据保存到数据库表,Redis,Hadoop,弹性搜索索引等等:http://luigi.readthedocs.io/en/stable/api/luigi .contrib.html#子模块