我正在使用赛璐珞的every
方法每微秒执行一个块,但是即使我指定小数点,它似乎总是每秒调用一次块。
interval = 1.0 / 2.0
every interval do
puts "*"*80
puts "Time: #{Time.now}"
puts "*"*80
end
我希望每 0.5 秒调用一次。但它每秒被调用一次。
有什么建议么?
您可以使用赛璐珞获得小数秒分辨率。
赛璐珞使用 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
线也不能可靠地给我微秒级的速度。