我知道红宝石的“合作”线程使用绿色线程。如何在我的应用程序中创建真正的“操作系统级”线程,以便使用多个cpu内核进行处理?
当前回答
Ruby 1.8只有绿色线程,没有办法创建一个真正的“操作系统级”线程。但是,ruby 1.9将有一个叫做光纤的新特性,它将允许您创建实际的操作系统级线程。不幸的是,Ruby 1.9仍处于测试阶段,预计几个月后就会稳定下来。
另一种选择是使用JRuby。JRuby将线程实现为操作系统级别的头,其中没有“绿色线程”。JRuby的最新版本是1.1.4,相当于Ruby 1.8
其他回答
使用drb怎么样?它不是真正的多线程,而是几个进程之间的通信,但你现在可以在1.8中使用它,而且它的阻力相当低。
如果您确实需要Ruby在产品级系统中的并行性(您不能使用beta),那么进程可能是更好的选择。 但是,首先在JRuby下尝试线程绝对是值得的。
另外,如果您对Ruby下线程的未来感兴趣,您可能会发现本文很有用。
这里有一些关于Rinda的信息,它是Linda(并行处理和分布式计算范式)的Ruby实现http://charmalloc.blogspot.com/2009/12/linda-tuples-rinda-drb-parallel.html
我将让“系统监视器”来回答这个问题。在这两种情况下,我用8个Ruby线程在i7(4个超线程核)机器上运行相同的代码(下面,计算质数)……第一次运行是:
Jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2014-02-03 6586) (OpenJDK 64-Bit Server VM 1.7.0_75) [amd64-java]
第二种是:
Ruby 2.2.1.p95 (2014-05-08) [x86_64-linux-gnu]
有趣的是,对于JRuby线程,CPU更高,但是对于解释后的Ruby,完成的时间略短。从图中很难看出这一点,但是第二次(解释的Ruby)运行使用了大约1/2的cpu(没有超线程?)
def eratosthenes(n)
nums = [nil, nil, *2..n]
(2..Math.sqrt(n)).each do |i|
(i**2..n).step(i){|m| nums[m] = nil} if nums[i]
end
nums.compact
end
MAX_PRIME=10000000
THREADS=8
threads = []
1.upto(THREADS) do |num|
puts "Starting thread #{num}"
threads[num]=Thread.new { eratosthenes MAX_PRIME }
end
1.upto(THREADS) do |num|
threads[num].join
end
如果您正在使用MRI,那么您可以用C编写线程代码作为扩展或使用ruby-inline gem。
推荐文章
- 如何找到包含匹配值的哈希键
- ExecutorService,如何等待所有任务完成
- 在python中创建线程
- 如何在Rails中找到当前的路由?
- 在Ruby中->运算符叫什么?
- Rails参数解释?
- Ruby中DateTime和Time的区别
- 如何从代理服务器后面更新Ruby Gems (ISA-NTLM)
- 如何用另一个键替换哈希键
- attr_accessor和attr_accessible的区别
- 处理来自Java ExecutorService任务的异常
- 如何从Ruby文件路径中获得没有扩展名的文件名
- rvm安装失败:“rvm不是一个函数”
- 学习Ruby on Rails
- Ruby中的数组切片:解释不合逻辑的行为(摘自Rubykoans.com)