1

我将如何在 ruby​​ 中每 x 秒执行一项特定任务?我已经尝试使用 Time.now.to_i 进行纪元,然后一旦 Time.now_i 命中它执行的第二个任务,但我没有成功地做到这一点,有人可以告诉我一个关于如何每 x 执行一个函数的小例子秒?

试图:

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

您可以使用Kernel#sleep相同的方法。

这是帖子

于 2013-09-21T21:28:59.923 回答
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 回答
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 回答