为WrapperTask

时间:2016-06-22 20:46:00

标签: python luigi

我正在使用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命令的经验?我在理解它时遇到了一些麻烦。

source code

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;

此代码段未执行其认为的操作。

我在这里离开吗?

1 个答案:

答案 0 :(得分:0)

我仍然认为最重要的.run()理论上应该能够做到这一点,我仍然不确定为什么不是,但是如果你只是想找到一种方法来批量传输文件之后运行流程,一个可行的解决方案就是让传输在def run(self): logger.info('transferring into current directory') self.client.copy('current-old','current') 方法中进行:

IplImage *src;
src->imageData;
src->widthStep;