gpt4 book ai didi

ruby - 有没有办法使用赛璐珞每微秒调用一个 block ?

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:31 25 4
gpt4 key购买 nike

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

interval = 1.0 / 2.0

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

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

有什么建议吗?

最佳答案

您可以使用 Celluloid 获得小数秒分辨率。

Celluloid 使用 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 或其他正在运行的计时器和使该特定计时器挨饿的 block 中花费了多长时间。我会通过尽可能简化情况并慢慢添加部件来确定减速发生的位置来解决这个问题。

至于微秒分辨率,我认为您不能指望用任何重要的代码可靠地降低到那么低。

简单的例子:

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 行,也不能可靠地给我微秒级的速度。

关于ruby - 有没有办法使用赛璐珞每微秒调用一个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14598285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com