Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby一次只创建3个线程_Ruby_Multithreading - Fatal编程技术网

Ruby一次只创建3个线程

Ruby一次只创建3个线程,ruby,multithreading,Ruby,Multithreading,我正在尝试运行500个客户端,这些客户端同时向服务器发送一些请求以进行负载测试。客户端又是一个ruby程序。听起来很琐碎。但我面临着ruby线程的奇怪问题。我的代码如下所示- n = 10 n.times do Thread.new do `calc` end end 代码是一个示例。我只是尝试从命令行运行calc命令(如果您在windows以外的平台上尝试此代码,请用在命令行或shell上运行的命令替换它)。这将稍后被“ruby my_client.rb”替换,并且n的值将

我正在尝试运行500个客户端,这些客户端同时向服务器发送一些请求以进行负载测试。客户端又是一个ruby程序。听起来很琐碎。但我面临着ruby线程的奇怪问题。我的代码如下所示-

n = 10

n.times do
  Thread.new do
    `calc`
  end
end
代码是一个示例。我只是尝试从命令行运行
calc
命令(如果您在windows以外的平台上尝试此代码,请用在命令行或shell上运行的命令替换它)。这将稍后被“
ruby my_client.rb
”替换,并且n的值将设置为500(或任何值)

我在这里面临的问题是,无论我想创建多少个线程,一次只创建3个线程。也就是说,只有3个计算窗口同时打开。其余线程只是在队列中等待这3个线程的终止。这可能与阻塞和非阻塞调用有关。但我尝试了相同程序的Java等价物,效果非常好。有句老话说,不推荐使用ruby中的线程。这是Ruby线程的问题,还是我做错了什么?

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

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


另一个选择是,因为看起来您正在生成一个线程以派生一个新进程,所以可能使用DRb来代替它。

这对我在使用textmate的os x上非常有效

n = 10

threads = []
n.times do |i|
  threads << Thread.new do
    `mate test#{i}.txt`
  end
end

threads.each { |t| t.join }
n=10
线程=[]
n、 是的|

线程您观察到的问题特定于GUI应用程序。当您在workers内部运行命令行时,它会变得更好

通过下面的例子,我可以很好地运行200个wget实例,这可能足以满足您的负载测试目标

n = 200

threads = []
(1..n).each do |i|
  threads << Thread.new do
    puts `wget google.com` # forgive me google
    sleep 10
    puts "#{i} done"
  end
end

threads.each do |t| # wait until all workers are done
  t.join
end
n=200
线程=[]
每个人都做|

线程您可能希望生成单独的进程
Kernel::fork
在Windows下不工作,因此您必须使用旧的
Kernel::system
Kernel::popen
并为此创建单独的脚本或使用特殊的命令行参数


尽管Ruby 1.9即将面世,如果您可以打开它,它确实有本机操作系统线程,类似的事情不会发生。

感谢DRb指针。Jruby应该解决这个问题。没有任何DRb方面的经验,我也会学习并尝试一下。谢谢:)仅仅因为Ruby是绿色线程,并不意味着它应该一次只运行三个线程。这看起来确实是Ruby有一个很大的io锁的原因,对我来说,这使得线程几乎毫无用处/对我来说很好,1.8.7.72-2在Debian GNU/Linux上。我认为这是Windows特有的东西。这是可能的,但java程序在同一平台、同一台机器上工作得很好。在Windows XP SP3下使用ruby 1.8.7对我来说效果很好。我在Windows XP SP3、ruby 1.8.7下对代码进行了排序,结果很好。