適度に実行時間を抑制するrate_throttle

cronなどで統計処理のSQLをたくさん投げたりするときに、mysqlにあまり負荷をかけたくないので、適度にsleepを挟みながら実行させる、という処理を書くときに、perlだと、Sub::Throttleというid:kazuhookuさんのライブラリを使っていたのですが、rubyで同様のライブラリを探すとなかったので、rubyrate_throttleという名前で移植しました。(本当はProc::Throttleにするつもりだったのですが、既にあったので....)

require 'rate_throttle'

1000.times do
    # limit block to 10% workload.
    RateThrottle.throttle(0.1) do
        # do something.
    end
end

こんな感じで書くと、ブロックを実行した後にその実行時間が10%になるようにsleepを入れてくれます。ブロック内の実行時間が1秒であれば、sleepは9秒で、合計10秒になる、という塩梅です。

crawlerとかを書いているときに適度にsleepを挟むといったときなどにも使えるのではないでしょうか。

参考: http://labs.cybozu.co.jp/blog/kazuho/archives/2008/08/sub-throttle.php