1

Rubyでx秒ごとに特定のタスクを実行するにはどうすればよいですか? エポックに Time.now.to_i を使用してみましたが、Time.now_i がそのタスクを実行する秒に達すると、実行に成功しませんでした。秒?

試み:

def interval(timeout,function,*data)
     now = Time.now.to_i
     tasktime = Time.now.to_i + timeout
     taskfunction = function
     taskdata = data
end

ruby で次に何をどのように行うべきかわからないため、そこでコードを停止しました。たとえば、誰かがこの例のようなことを実行できるコードを生成できる場合は、どうすればよいでしょうか。

def say(word)
    puts word
end 

関数の間隔を設定すると、データは「単語」になり、x秒ごとにその関数が実行されます

4

3 に答える 3

2

他の回答で示唆されているように、単純sleepに一定の時間だけ実行すると、エラーは実行を続けると汚染され、正確ではなくなります。実際、各反復は、指定された間隔よりも長くかかります。

以下に示す回答は、反復ごとにラグを調整します。

module Kernel
  def tick_every sec, &pr
    Thread.new do loop do
      pr.call
      t = Time.now.to_f
      frac = t.modulo(sec.to_f)
      sleep(sec - frac)
    end end
  end
end

thread = tick_every(2) do
  puts "foo"
end
...
some_other_tasks
...
thread.kill
于 2013-09-21T21:35:12.560 に答える
2

Kernel#sleep同じメソッドを使用できます。

投稿はこちら

于 2013-09-21T21:28:59.923 に答える
1

このメソッドは、単語を 2 秒ごとに無限に同期的に配置します (つまり、他の Ruby コードは、この実行が終了するまで待機する必要があります (..endless..:))。

def say(word)
  while true do
    t = Time.now.to_f
    puts word
    frac = t.modulo(2.to_f)
    sleep(2 - frac)
  end
end
于 2013-09-21T21:33:34.333 に答える