2

以我RoR应用程序(红宝石2.0.0,Rails的4.0),我有一组语句:的Ruby/Rails多线程 - 并行运行语句(优选使用并行宝石)

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,所以这应该很容易,但它似乎并不支持非集合语句。任何方式我可以Parralelize语句,并等待执行在aggregated变量获取所有的数据?

回答

2

既然你说你想避免使用集合,你可以使用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选择是使用数组里面的特效:

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(:+) 
+1

这并不看好。谢谢〜 – Sid

+1

@Sid:很受欢迎。我还添加了一个简单的例子,它有相同的输出。它确实使用了一个数组,但它允许每个任务的自定义逻辑。 – user000001