1

我遵循了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“语言”中的目标)。all 目标的依赖关系树如下所示:

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 中的所有目标(文件名目标)并行执行,当调用 withmake -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 个稍微不同的依赖包->上传->远程构建任务链,它们应该全部并行运行,直到一切就绪,然后继续进行非并行测试。

在 GNU make 中,这一切都没有问题,但是我们的开发团队只使用 Java,他们不喜欢使用 15 年历史的纯二进制工具来完成看起来像是 gradle 的工作的想法。

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

4

1 回答 1

0

这是从 Gradle 4.0 开始的默认Worker API 功能:

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

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

于 2018-12-24T23:23:38.853 回答