[ruby] 一定時間処理を停止する。スリーパー

 ruby デフォルトの sleep は、指定した秒数処理を停止しますが、これだとループの中に sleep を刺した場合、ループ内メイン処理の時間 + sleep の秒数が掛かってしまい、指定秒数ごとに処理を実施するという要件を微妙に満たせません。

ちょっと困ったので、Sleeper クラスを作ってみました

class Sleeper
  @@sleepers = {}
  attr_accessor :sleep_time

  def self.[](name)
    return false if name.nil? || name == ""

    @@sleepers[name] ||= self.new name
  end

  def initialize(name)
    @name = name
    @before_time = Time.at 0
  end

  def reset_timer
    @before_time = Time.now
  end

  def sleep(sleep_time = nil)
    sleep_time = @sleep_time if sleep_time.nil?

    # コンマミリ秒が切り下げられて必ずスリープが少し足りなくなるので 1 を足す
    Kernel.sleep (@before_time + sleep_time - Time.now + 1).to_i if (@before_time + sleep_time) > Time.now

    @before_time = Time.now
  end
end

使い方は単純で

Sleeper['app_name'].sleep_time = 5

arr.each do |val|
  Sleeper['app_name'].sleep
  exec
end

こんな感じで使えます。

ミリ秒まで取ってないので精度は甘々ですが、
メインの処理が0秒~1分とかばらつきがある場合、スリープ時間を安定させられます。

APIを叩くのに一定時間空けたい時とかに有効です。

  • Sildenafil Citrate

    Sildenafil Citrate Buy Viagra Viagra Generic

RSS / feedly
  • follow us in feedly
  • follow us in feedly
ソーシャル
広告