ruby - 为什么我的 Minitest 测试没有并行运行?

标签 ruby parallel-processing minitest

我最近才发现我的 Minitest 测试用例可以并行运行。我所要做的就是

require "minitest/hell"

所以我做到了。不幸的是,我的测试运行与以前完全一样。一切都过去了,它所花费的时间与往常一样多。我在运行我的测试套件时检查了 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 时不会并行运行。

您可以使用支持并发线程的 Ruby 解释器(如 JRuby 或 Rubinius)让测试并行运行。

Read this article for more details.

关于ruby - 为什么我的 Minitest 测试没有并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26297653/

相关文章:

ruby-on-rails - ruby/rails 中的自然语言日期?

ruby - 如何在linux中自动缩进ruby代码

ruby-on-rails-4 - 测试 Prawn 生成的pdf是否没有错误

java - 1 个核心上的并行 Java 流

python - aiohttp 优于 pycurl multi,因为 python 有 gil,切换到 aiohttp 可以获得什么好处?

ruby - 如何求阶乘之和

ruby - 使用 Guard 忽略目录

ruby - YAML 语法和 Ruby 解析的说明

ruby-on-rails - 没有端口号的 Rails 应用程序

multithreading - OpenMP:在线程之间共享数组