ruby-on-rails - Ruby/Rails 多线程 - 并行运行语句(最好使用 Parallel Gem)

标签 ruby-on-rails ruby multithreading parallel-processing rubygems

在我的 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/

相关文章:

ruby-on-rails - 有没有办法在 Rails 中保存 Paypal 的 payKey

ruby-on-rails - 使用 validates_presence_of 和 validates_numericality_of 时验证失败

ruby-on-rails - F.select 输入在编辑时不保存值

c# - 设置 Thread.Priority = Lowest 的真正含义是什么?

ruby-on-rails - 为什么这个对 ActiveRecord 关联的引用失败了?

ruby-on-rails - 缺少部分文件,但文件名中带有下划线

ruby - 你检查你的 rvmrc 文件吗?

ruby - 如何从数组中的所有元素中删除字符串?

ruby - 如何并行启动 Ruby 命令

java - 重现线程干扰