1

我正在使用赛璐珞的every方法每微秒执行一个块,但是即使我指定小数点,它似乎总是每秒调用一次块。

interval = 1.0 / 2.0

every interval do
  puts "*"*80
  puts "Time: #{Time.now}"
  puts "*"*80
end

我希望每 0.5 秒调用一次。但它每秒被调用一次。

有什么建议么?

4

1 回答 1

4

您可以使用赛璐珞获得小数秒分辨率。

赛璐珞使用 Timers gem 来管理every浮点时间数学和 ruby sleep​​,它具有合理的亚秒级分辨率。

以下代码完美运行:

class Bob
  include Celluloid
  def fred
    every 0.5 do
      puts Time.now.strftime "%M:%S.%N"
    end
  end
end

Bob.new.fred

它产生以下输出:

22:51.299923000
22:51.801311000
22:52.302229000
22:52.803512000
22:53.304800000
22:53.805759000
22:54.307003000
22:54.808279000
22:55.309358000
22:55.810017000

如您所见,它并不完美,但对于大多数用途来说已经足够接近了。

如果您看到不同的结果,很可能是因为您的代码在您给定的块中花费了多长时间,every或者其他计时器正在运行并且使该特定计时器处于饥饿状态。我会通过尽可能简化情况并慢慢添加部件来确定减速发生的位置来解决这个问题。

至于微秒级分辨率,我认为您不能希望使用任何重要的代码可靠地降低这么远。

简单的例子:

def bob
  puts Time.now.strftime "%M:%S.%N"
  sleep 1.0e-6
  puts Time.now.strftime "%M:%S.%N"
end

产生:

31:07.373858000
31:07.373936000


31:08.430110000
31:08.430183000


31:09.062000000
31:09.062079000


31:09.638078000
31:09.638156000

正如你所看到的,即使我的机器上只有一个基本的 ruby​​ 版本,只运行一条简单的IO线也不能可靠地给我微秒级的速度。

于 2013-02-01T08:26:53.910 回答