并行化gradle任务,如GNU Makefile

时间:2018-03-21 12:57:06

标签: gradle makefile gnu-make parallel-builds

我按照https://guides.gradle.org/using-the-worker-api/中的教程进行操作。简介:它是关于gradle运行中任务的并行化,从4.0版开始支持,并且gradle团队显然认为他们有一个很好的解决方案。

相比之下,这就是Makefile的作用(使用相同的路径进行比较):

all: md5 sha256

clean:
    $(RM) -r build

build/md5/%.md5: src/%
    mkdir -p build/md5/
    md5sum $< >$@
    sleep 3

build/sha256/%.sha256: src/%
    mkdir -p build/sha256/
    sha256sum $< >$@
    sleep 3

md5: $(patsubst src/%,build/md5/%.md5,$(wildcard src/*))
sha256: $(patsubst src/%,build/sha256/%.sha256,$(wildcard src/*))

正如您所看到的:我还添加了sha256任务(Makefile中的目标&#34;语言&#34;)。所有目标的依赖关系树如下所示:

all + md5    + build/md5/feynman.txt.md5
    |        | build/md5/oppenheimer.txt.md5
    |        \ build/md5/einstein.txt.md5
    \ sha256 + build/sha256/feynman.txt.sha256
             | build/sha256/oppenheimer.txt.sha256
             \ build/sha256/einstein.txt.sha256

级别3中的所有目标(文件名目标)都是并行执行的,当使用make -j 6或更高级别调用时,生成的时间为3秒(带有睡眠)

相比之下,扩展的build.gradle:

task md5(type: CreateMD5) {
    destinationDir = file("${buildDir}/md5") 
    source file("src/") 
}

task sha256(type: CreateMD5 /*enough for the example*/) {
    destinationDir = file("${buildDir}/sha256") 
    source file("src/") 
}

task all(dependsOn: [md5, sha256])

不能很好地扩展。它有两个可并行处理的任务,它们并行处理3个文件,因为任务都是为了这样做而设计的,但gradle不够智能,即使它们完全独立,也可以并行化两个任务md5和sha256。因此产生的时间是6秒(2 * 3)

现在:对于更复杂的场景,我需要链接更多不同的操作并将它们并行化。例如10个略有不同的依赖包 - > upload-&gt;远程构建任务链,这些任务应该并行运行,直到所有内容都完成,然后继续进行非并行测试。

在GNU make中,这一切都没有问题,但我们的开发团队只是Java而且他们不喜欢使用15年前的纯二进制工具来实现它的外观。为gradle工作。

是否真的没有机会在gradle中设置这种类型的并行化?

1 个答案:

答案 0 :(得分:0)

从Gradle 4.0开始,这是默认的Worker API feature

  

一旦提交了任务动作的所有工作,就可以安全地退出任务动作。该工作将异步和并行执行(取决于max-workers的设置)。当然,在完成所有异步工作之前,任何依赖于此任务的任务(以及该任务的任何后续任务动作)都不会开始执行。但是,与此任务无关的其他独立任务也可以立即开始执行。

TLDR: 使用Worker API异步提交工作的独立任务(确保在任务操作中不要调用workerExecutor.wait())将自动并行执行。