testing - 是什么限制了 Gradle 构建中的活跃工人数量?
问题描述
我正在尝试在我的笔记本电脑上并行运行测试,它有 4 个物理 CPU 和 8 个逻辑 CPU。
➜ sysctl -n hw.ncpu
8
➜ sysctl -n hw.physicalcpu
4
我想最多并行运行 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 的数量。奇怪的是,其中一名工人显示为IDLE
.
我在另一台只有 2 个物理内核的机器上得到了相同的行为,并且它仅限于两个进程,即根本没有并行执行。
为什么是一名工人IDLE
?
解决方案
--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
推荐阅读
- r - R/Excel/Tableau - 透视标题和副标题
- java - Java 动态多态和类文件
- c# - NET.Core 2.0 未知构造函数的 IOC 问题
- javascript - 不操纵浏览器扩展的 DOM 的价值
- swift - 在 Swift Array 中,是否有一个函数可以返回基于 where 子句的最后一个索引?
- suitecrm - 如何将标签添加到suitecrm
- redux - 如何从状态中删除列表中的项目?
- android - 程序类型已经存在:android.support.constraint.BuildConfig
- jquery - 将 JQuery 添加到 gopherjs 测试
- python - 帧更新 Tkinter