通常我们逐个迭代一个数组:
a = [1, 2, 3, 4]
b = []
a.each do |x|
b << x * 5
end
b = [5, 10, 15, 20]
如果我不关心数组中内容的顺序,但想通过同时运行乘法运算来提高迭代速度,该怎么办?例如,这样的结果是可以接受的:
b = [15, 10, 5, 20] # or
b = [5, 20, 15, 10] # or
b = [20, 15, 5, 10]
我该怎么做?
答案 0 :(得分:4)
也就是说,假设您正在运行提供真正并行性的VM:
b = a.map {|x|
Thread.new {
Thread.current[:out] = x * 5
}
}.map {|t| t.join; t[:out] }
(这段代码非常难看,应该根据实际用途进行重构。它还会按照创建线程的顺序返回结果,同时仍然可以并行化任务。)
这里的要点是1)在线程局部变量中传播返回值(因此您不必对共享值执行possibly-unatomic operation;如果您想这样做,则需要引入一个Mutex),以及2)在创建的每个线程上调用#join
,以便我们确保创建的每个线程都已完成运行。