Ruby Ruby 3.0 用那种方式写并行计算快,ractor 还是 gem parallel

tomanderson · 2020年12月31日 · 最后由 Mark24 回复于 2022年04月18日 · 929 次阅读

有一些计算密集型的任务需要并行算。ruby2 时代我常用的套路是:安装 gem parallel,它提供了多线程、多进程两种方法,而且语法也比较简单。一般来说,如果用多进程方法,基本上所有 cpu 核心都可以跑满。

但是现在 ruby3 有了 ractor。我在想,如果改用 ractor 做并行,会比 parallel 更快吗?

不清楚 parallel 和 ractor 的具体实现原理,故请各位大神、或者用过的同学指教。

多进程和多线程的区别。原来的因为全局锁,所以不能真正并行。

哪个快难说,不过 Ractor(等成熟以后)内存上应该会很占优,毕竟这是设计 Ractor 的初衷

require 'benchmark'

def fib n
  if n < 2
    1
  else
    fib(n-2) + fib(n-1)
  end
end

# 直接执行
puts Benchmark.measure {
  8.times do
    fib(40)
  end
}

# 进程
puts Benchmark.measure {
  8.times do
    fork { fib(40) }
  end
  Process.wait
}


# 线程
puts Benchmark.measure {
  8.times.map {
    Thread.new{fib(40)}
  }.each{|t| t.value}
}


# Ractor
puts Benchmark.measure {
  8.times.map {
    Ractor.new{ fib(40) }
  }.each{|r| r.take}
}
方法 user time system time user+system times real time
顺序执行 84.713012 0.131839 84.844851 84.845332
进程 0.000214 0.002798 14.607795 14.787335
多线程 84.604395 0.145657 84.750052 84.744966
Ractor 116.438639 0.148765 116.587404 14.853680

答案是 Ractor 和多进程差不多快

需要 登录 后方可回复, 如果你还没有账号请 注册新账号