在我的 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 赋值的执行是独立的,并且以任何顺序或并行发生。我有Parallel Gem在我的 Gemfile 中,所以这应该很容易,但是它似乎不太支持非集合语句。有什么方法可以并行化语句并等待聚合
变量执行以获取所有数据吗?
最佳答案
既然您说要避免使用集合,则可以使用 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 选项是在数组中使用 procs:
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(:+)
关于ruby-on-rails - Ruby/Rails 多线程 - 并行运行语句(最好使用 Parallel Gem),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40815086/