使用doit并行运行(-n选项)时子任务依赖等待问题咨询
解决doit并行运行时子任务依赖不生效的问题
你遇到的这个问题其实是doit并行调度的一个特性:默认情况下,同一任务生成器产出的子任务之间,不会仅通过file_dep/targets自动建立依赖关系。并行模式下,doit的调度逻辑优先看task_dep定义,而不是自动解析文件依赖来排序任务,所以才会出现test2直接启动、找不到tmp.txt的情况。
解决方案:显式指定子任务依赖
最直接的办法是给test2添加task_dep,明确它需要等待pexample:test1完成:
def task_pexample(): yield { "name":"test1", "actions": ["sleep 5", "touch tmp.txt"], "targets":["tmp.txt"] } yield { "name":"test2", "file_dep":["tmp.txt"], "targets":["tmp2.txt"], "actions": ["cp tmp.txt tmp2.txt"], "task_dep": ["pexample:test1"] # 显式声明依赖test1子任务 }
为什么原来的写法不行?
doit里的file_dep主要作用是检查文件是否存在/是否过期,以此判断任务是否需要重新运行,而不是用来在并行调度时控制任务执行顺序。当你用-n 2开启并行时,doit会把所有没有task_dep约束的任务视为可同时执行的,所以test2会直接启动,此时test1的sleep 5还没跑完,tmp.txt自然不存在。
修改后再运行doit -n 2 -s pexample,test2就会乖乖等test1创建完tmp.txt再执行,不会报错了。
内容的提问来源于stack exchange,提问作者tlamadon
相关产品推荐
相关产品推荐

