【问题标题】:Tell waf to wait for task to finish before staring next task告诉妻子等待任务完成后再开始下一个任务
【发布时间】:2018-01-22 18:21:05
【问题描述】:

我在waf 中有两个任务,它们需要以正确的顺序执行,第二个任务必须等到第一个任务完成。

为了表明它的行为方式符合我的预期,我在任务内等待,在第一个任务 (t_1) 4 秒和第二个任务 (t_2) 1 秒。第二个任务首先完成。这可以看出,因为我等待后创建的文件夹有时间戳t_2 < t_1

在一个问题中: 如何告诉 waf,t_2 是在 t_1 成功完成后执行的?


  1. MWE:wscript

    from waflib import Context, Options
    from waflib import Task, TaskGen
    from waflib.Tools.compiler_c import c_compiler
    
    def options(opt):
        opt.load('compiler_c')
    
    def configure(cnf):
        cnf.load('compiler_c')
    
    def build(bld):
        bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
    
    class t_1(Task.Task):
        always_run = True
        run_str = 'echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1'
        color = 'RED'
    
    
    @TaskGen.feature('t_1')
    @TaskGen.after('apply_link')
    @TaskGen.before('t_2')
    def add_t_1_task(self):
        self.create_task('t_1')
    
    
    class t_2(Task.Task):
        always_run = True
        run_str = 'echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2'
        color = 'RED'
    
    
    @TaskGen.feature('t_2')
    @TaskGen.after('apply_link', 't_1')
    def add_t_2_task(self):
        self.create_task('t_2')
    

【问题讨论】:

    标签: python waf


    【解决方案1】:

    您必须在任务的 after 属性中指定必须运行 before 的任务(在该示例中为 t_1),该任务应该“等待”要完成的另一项任务(在该示例中(t_2)。 指定如下:after = ['t_1']

    可以在build order constraints 部分的waf book 中找到相关文档。

    当前 waf book (waf 2.0) 中解释 generic task generator is §9.3 的文档,特别是 §9.3.4 解释了任务生成器的执行顺序。


    完整的 MWE 示例如下所示:

    from waflib import Context, Options
    from waflib import Task, TaskGen
    from waflib.Tools.compiler_c import c_compiler
    
    def options(opt):
        opt.load('compiler_c')
    
    def configure(cnf):
        cnf.load('compiler_c')
    
    def build(bld):
        bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
    
    class t_1(Task.Task):
        always_run = True
        run_str = 'date && echo 1 && echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1 && date && echo 1'
        color = 'RED'
    
    
    @TaskGen.feature('t_1')
    @TaskGen.after('apply_link')
    @TaskGen.before('t_2')
    def add_t_1_task(self):
        self.create_task('t_1')
    
    
    class t_2(Task.Task):
        always_run = True
        after = ['t_1'] # <---------------------------- **The problems solution**
        run_str = 'date && echo 1 && echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2 && date && echo 2'
        color = 'RED'
    
    
    @TaskGen.feature('t_2')
    @TaskGen.after('apply_link', 't_1')
    def add_t_2_task(self):
        self.create_task('t_2')
    

    【讨论】:

    • @TaskGen.before('t_2') 是错误的。应该是@TaskGen.before('add_t_2_task')。此外,没有必要。任务t_1t_2 可以在您的示例中以任何顺序创建。重要的是执行顺序。
    • 感谢您的评论。我在哪里可以找到我需要将任务生成器方法而不是任务作为约束的文档?但是我对class t_2(Task.Task):中使用after = ['t_1']的问题的解决方法是对的吗?
    • @neuro 很抱歉再次询问,但您似乎对 waf 非常有经验,如果您能告诉我,在文档中哪里可以找到它,我会非常感激?
    • 我添加了任务方法执行顺序的参考,即当前waf书中的§9.3.4。 §9.3.6 可能也很有趣,它解释了如何设置 taskgen 之间的抽象依赖关系。
    • 感谢您更新您已经完美的答案 - 我已经阅读了这些部分,但似乎我错过了一些需要完全理解的内容,因此我会再读一遍!
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2012-04-22
    • 2012-01-17
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多