我正在使用Luigi运行多个任务,然后我需要将输出批量传输到标准化文件位置。我编写了一个带有重写complete()
方法的WrapperTask来执行此操作:
from luigi.task import flatten
class TaskX(luigi.WrapperTask):
date = luigi.DateParameter()
client = luigi.s3.S3Client()
def requires(self):
yield TaskA(date=self.date)
yield TaskB(date=self.date)
def complete(self):
tasks_complete = all(r.complete() for r in flatten(self.requires()))
## at the end of everything, batch copy the files
if tasks_complete:
self.client.copy('current-old', 'current')
return True
else:
return False
if __name__ == "__main__":
luigi.run()
但是当进程实际完成时,我无法调用complete()
的条件部分。
我认为这是因为其他人指出asynchronous behavior,但我不确定如何修复它。
我尝试使用这些命令行参数运行Luigi:
$ PYTHONPATH="" luigi --module x TaskX --worker-retry-external-task
但这似乎没有正常工作。这是处理此类任务的正确方法吗?
另外,我很好奇 - 有没有人有--worker-retry-external-task
命令的经验?我在理解它时遇到了一些麻烦。
def _is_external(task):
return task.run is None or task.run == NotImplemented
调用来确定LuigiTask是否具有run()
方法,WrapperTask
不具有--retry-external-task
方法。因此,我希望complete()
标志为此重试>>> import luigi_newsletter_process
>>> task = luigi_newsletter_process.Newsletter()
>>> task.run
<bound method Newsletter.run of Newsletter(date=2016-06-22, use_s3=True)>
>>> task.run()
>>> task.run == None
False
>>> task.run() == None
True
,直到它完成,从而执行操作。然而,只是在翻译中玩弄让我相信:
struct myStruct{
//some data
} *p;
此代码段未执行其认为的操作。
我在这里离开吗?
答案 0 :(得分:0)
我仍然认为最重要的.run()
理论上应该能够做到这一点,我仍然不确定为什么不是,但是如果你只是想找到一种方法来批量传输文件之后运行流程,一个可行的解决方案就是让传输在def run(self):
logger.info('transferring into current directory')
self.client.copy('current-old','current')
方法中进行:
IplImage *src;
src->imageData;
src->widthStep;