我按照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中设置这种类型的并行化?
答案 0 :(得分:0)
从Gradle 4.0开始,这是默认的Worker API feature:
一旦提交了任务动作的所有工作,就可以安全地退出任务动作。该工作将异步和并行执行(取决于max-workers的设置)。当然,在完成所有异步工作之前,任何依赖于此任务的任务(以及该任务的任何后续任务动作)都不会开始执行。但是,与此任务无关的其他独立任务也可以立即开始执行。
TLDR:
使用Worker API异步提交工作的独立任务(确保在任务操作中不要调用workerExecutor.wait()
)将自动并行执行。