我遵循了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 中设置这种类型的并行化吗?