我正在学习Ruby中的Threads,来自 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
语句,而最初的一个花费时间进行资源分配/初始化/终止线程?
答案 0 :(得分:3)
MRI中的线程(“黄金标准”红宝石)并不是真正的并发。有一个全局VM锁(GVL)可以防止线程同时运行。但是,它允许在当前线程在I / O上被阻塞时运行其他线程,但这不是你的情况。
因此,您的代码以串行方式运行,并且您具有线程开销(创建/销毁线程等)。这就是它变慢的原因。