Hub*_*bro 3 ruby parallel-processing minitest
我刚刚发现我的Minitest测试用例可以并行运行.我所要做的就是
require "minitest/hell"
Run Code Online (Sandbox Code Playgroud)
所以我做到了.不幸的是,我的测试运行与以前一样.一切都过去了,它需要的时间与通常一样多.我htop在运行我的测试套件时检查过,只使用了一个核心.
我在随机测试中设置断点以检查测试是否实际设置为并行运行:
(byebug) Minitest::Test.test_order :parallel
发生什么了?
我的第一个假设是Minitest在决定产生多少进程时会计算CPU内核的数量.我有多个物理处理器(在虚拟机中),但每个处理器只有1个核心.我已经将我的VPS改为拥有两个物理处理器,每个处理器有4个核心,而我的测试仍然没有并行运行.
$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 2 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 62 Stepping: 4 CPU MHz: 2600.000 BogoMIPS: 5200.00 Hypervisor vendor: VMware Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0-7
Minitest使用线程而不是进程来进行并行测试.
由于MRI(标准Ruby解释器)具有全局解释器锁,因此一次只能执行一个线程.因此,使用MRI时,您的测试不会并行运行.
通过使用支持JRuby或Rubinius等并发线程的Ruby解释器,您可以让测试并行运行.