Ruby thread pool

有时候会遇到一个情况需要在多个远程服务获取数据。

例如服务 a 需要 2 秒,服务 b 需要 5 秒,按照正常处理总共就需要 2+5 总共 7 秒了。

如果 ab 之间并没有相互依赖关系,我们可以使用 thread pool 来并发获取数据,将总体耗时由 a + b 降低到 a、b 两者中的最大值。

require 'thread/pool'
require 'thread/future'
require 'benchmark'

def a
  sleep 2
  'a'
end

def b
  sleep 5
  'b'
end

Benchmark.bmbm do |x|
  x.report("normal") { 
    puts "#{a}#{b}"
  }
  x.report("Thread.future")  { 
    pool = Thread.pool 2
    f1 = pool.future {
      a
    }
    f2 = pool.future {
      b
    }
    puts "#{~f1}#{~f2}"
  }
end

使用 Benchmark 对比,和我们设想的完全一样。

Rehearsal -------------------------------------------------
normal        ab
  0.000000   0.000000   0.000000 (  7.010414)
Thread.future ab
  0.000000   0.000000   0.000000 (  5.002781)
---------------------------------------- total: 0.000000sec

                    user     system      total        real
normal        ab
  0.000000   0.000000   0.000000 (  7.004402)
Thread.future ab
  0.000000   0.000000   0.000000 (  5.003263)

上一篇
大型网站系统与 Java 中间件开发实践 大型网站系统与 Java 中间件开发实践
阿姆达尔定律(Amdahl’s law)告诉我们,程序中可并行代码的比例决定你增加处理器所能带来的速度提升上限,是否能达到这个上限,还取决于很多其他因素。 例如,当 P=0.5 时,我们可以计算出速度提升的上限就是 2。而如果 P=0.2,
2015-04-17
下一篇
Ruby synchronized Ruby synchronized
最近学习 Java 的时候了解到在 Java 中 synchronized 关键字可以保证代码块的串行执行。 在 ruby 开发中往往使用第三方来保证,比如使用数据库或文件系统。其实 ruby 也有类似的方式来保证代码块的串行执行,它就是
2015-04-09