Ruby一次只创建3个线程

Chi*_*tan 6 ruby multithreading

我试图运行500个客户端,同时向服务器发送一些请求以进行负载测试.客户端再次成为ruby程序.听起来微不足道.但是我遇到了ruby线程的奇怪问题.我的代码看起来像这样 -

n = 10

n.times do
  Thread.new do
    `calc`
  end
end
Run Code Online (Sandbox Code Playgroud)

代码是一个示例.我只是试图从命令行运行calc命令(如果您在Windows以外的平台上尝试此代码,请将其替换为适用于您的命令行或shell的命令).稍后将替换为' ruby my_client.rb',并且n的值将设置为500(或其他).

我在这里遇到的问题是,无论我想创建多少个线程,一次只创建3个线程.那只是同时打开3个计算窗口.剩余的线程只是在队列中等待等待这3个线程的终止.可能与阻止和非阻塞调用有关.但是我尝试了Java相同的程序,它运行得很好.这是一句老话,不建议使用红宝石线.这是Ruby的线程存在问题还是我做错了?

小智 3

Ruby (MRI) 的“Matz”C 实现在 1.8.6 之前不使用本机线程。我相信 Ruby 1.9 中已经改变了这一点,但我知道由于全局解释器锁,我们可能仍然看不到出色的多线程性能。

如果您确实需要良好的多线程支持,并且您的软件是用 Ruby 编写的,您可以尝试在 JRuby 上运行它。快速健全性测试表明,使用您的示例,我将在 MRI 上获得 2 个操作系统线程,在 JRuby 下运行相同的东西时将获得 12 个操作系统线程。这是在 OS X 上使用“MRI”1.8.6 和 JRuby 1.1.6。

另一种选择是使用 DRb,因为看起来您正在生成一个线程以分叉新进程。