You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:34:09