在我的RoR应用程序(Ruby 2.0.0,Rails 4.0)中,我有一组语句:
a = user.get_some_data
b = car.get_car_parts
c = home.get_temperature
d = random.get_random_data
aggregated = a + b + c + d
如上文故意所示,将值分配给变量a,b,c和d的执行是独立的,并且可以按任何顺序或并行发生。我的Gemfile中有Parallel Gem,所以这应该很容易,但是它似乎不能很好地支持非集合语句。我可以以任何方式对语句进行并行化并等待
aggregated
变量执行以获取所有数据吗? 最佳答案
由于您说要避免使用集合,因此可以使用case
语句来分配变量。
a = b = c = d = 0
Parallel.each 1..4, in_threads: 4 do |j|
puts "running thread #{j}..."
case j
when 1
a = user.get_some_data
when 2
b = car.get_car_parts
when 3
c = home.get_temperature
when 4
d = random.get_random_data
end
end
puts "done. a=#{a}, b=#{b}, c=#{c}, d=#{d}"
aggregated = a + b + c + d
puts "aggregated: #{aggregated}"
较简短但较不易理解的IMO选项是在数组内使用proc:
aggregated = Parallel.map([
->(){ user.get_some_data },
->(){ car.get_car_parts },
->(){ home.get_temperature },
->(){ random.get_random_data }
], in_threads: 4){|j| j.call}.reduce(:+)