在Gradle构建中限制活动工人的数量是多少?

时间:2019-04-05 09:48:45

标签: testing gradle spock

我正在尝试在笔记本电脑上并行运行测试,该笔记本电脑具有4个物理CPU和8个逻辑CPU。

➜  sysctl -n hw.ncpu
8
➜  sysctl hw.physicalcpu
hw.physicalcpu: 4

这是我正在运行的命令:

./gradlew remoteChromeTest -Pparallel=4 --continue --max-workers=8

parallel属性进入maxParallelForks任务的Test

不过,Gradle似乎最多只能同时占用4个工人(其中一个似乎对构建本身是保留的),这与物理CPU的数量相吻合。

输出看起来像这样:

> Task :remoteChromeTest
Running tests in parallel using 4 processes.
<============-> 92% EXECUTING [12s]
> :remoteChromeTest > 0 tests completed
> :remoteChromeTest > Executing test spec.Spec1
> IDLE
> :remoteChromeTest > Executing test spec.Spec2
> :remoteChromeTest > Executing test spec.Spec3

因此,只有3个测试并行运行。

我在这里想念什么?该文档表明,这可能超出实际CPU的数量。

我在另一台只有2个物理内核的机器上也得到了相同的行为,并且它仅限于两个进程,即根本没有并行执行。

1 个答案:

答案 0 :(得分:1)

--max-workers不仅用于测试执行,而且还用于并行项目执行。但是,在示例中,您将测试执行并行度限制为4。尝试将maxParallelForks设置为大于4,您将在测试执行中看到更多的并行度。但是无论如何,它将限制在测试次数和--max-workers之间的最小值。

您还可以使用--parallel选项启用并行项目执行。同样,构建并行性(包括测试并行性)将限于--max-workers

subprojects {
    tasks.withType(Test) {
        maxParallelForks = 8
    }
}
gradle clean build --parallel --max-workers=6
...
<<===========--> 85% EXECUTING [15s]
>> :module-1:test > 4 tests completed
>> :module-2:test > 2 tests completed
>> :module-2:test > Executing test so.Module2Spec3
>> :module-2:test > Executing test so.Module2Spec1
>> :module-1:test > Executing test so.Module1Spec4
>> :module-1:test > Executing test so.Module1Spec2
>> :module-1:test > Executing test so.Module1Spec1
>> :module-1:test > Executing test so.Module1Spec3
gradle clean build --parallel --max-workers=12
...
<===========--> 85% EXECUTING [13s]
> :module-1:test > 0 tests completed
> :module-2:test > 0 tests completed
> :module-2:test > Executing test so.Module2Spec1
> :module-2:test > Executing test so.Module2Spec2
> :module-2:test > Executing test so.Module2Spec3
> :module-2:test > Executing test so.Module2Spec4
> :module-1:test > Executing test so.Module1Spec1
> :module-1:test > Executing test so.Module1Test2
> :module-1:test > Executing test so.Module1Spec4
> :module-1:test > Executing test so.Module1Test3
> :module-1:test > Executing test so.Module1Test1
> :module-1:test > Executing test so.Module1Spec3
> :module-1:test > Executing test so.Module1Spec2
> :module-1:test > Executing test so.Module1Test4