2

我正在学习 Ruby 中的线程,来自The Ruby Programming Language book 并发现这种方法被描述为每个迭代器的并发版本,

module Enumerable
  def concurrently
    map {|item| Thread.new { yield item }}.each {|t| t.join }
  end
end

以下代码

 start=Time.now
 arr.concurrently{ |n| puts n} # Ran using threads
 puts "Time Taken #{Time.now-start}"

输出:Time Taken 6.6278332

尽管

start=Time.now
arr.each{ |n| puts n} # Normal each loop
puts "Time Taken #{Time.now-start}"

输出:Time Taken 0.132975928

为什么没有线程会更快?是实现错误还是第二个只有puts声明,而第一个需要时间进行资源分配/初始化/终止线程?

4

1 回答 1

3

MRI(“黄金标准”红宝石)中的线程并不是真正并发的。有一个全局 VM 锁 (GVL) 可防止线程同时运行。但是,当当前线程在 I/O 上被阻塞时,它允许其他线程运行,但这不是你的情况。

因此,您的代码串行运行,并且您有线程开销(创建/销毁线程等)。这就是为什么它更慢。

于 2013-04-11T13:57:15.460 回答