在我的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(:+)

10-05 23:03
查看更多