Ruby一次只创建3个线程
我正在尝试运行500个客户端,这些客户端同时向服务器发送一些请求以进行负载测试。客户端又是一个ruby程序。听起来很琐碎。但我面临着ruby线程的奇怪问题。我的代码如下所示-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的值将
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下对代码进行了排序,结果很好。