如何在Ruby中循环延迟?

Sal*_*ati 12 ruby loops

例如,如果我想制作一个计时器,我如何在循环中进行延迟,以便以秒为单位计算,而不是仅仅在几毫秒内循环它?

Phr*_*ogz 24

鉴于您提出的非常简单的直接问题,上面的"评论"是您的答案:

1.upto(5) do |n|
  puts n
  sleep 1 # second
end
Run Code Online (Sandbox Code Playgroud)

您可能希望定期运行方法,而不会阻止其余代码.在这种情况下,您希望使用一个Thread(并且可能创建一个互斥锁以确保两段代码不会同时尝试修改相同的数据结构):

require 'thread'

items = []
one_at_a_time = Mutex.new

# Show the values every 5 seconds
Thread.new do
  loop do
    one_at_a_time.synchronize do
      puts "Items are now: #{items.inspect}"
      sleep 5
    end
  end
end

1000.times do
  one_at_a_time.synchronize do
    new_items = fetch_items_from_web
    a.concat( new_items )
  end
end
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 13

不知何故,许多人认为将sleep具有恒定时间间隔的方法作为其参数将起作用.但请注意,没有方法需要零时间.如果你放入sleep(1)一个循环,1只要你在循环中有一些其他内容,循环肯定会超过秒.更糟糕的是,处理循环的每次迭代并不总是花费相同的时间.每个周期将花费超过1秒,错误是随机的.随着循环继续运行,此错误将污染并始终向正增长.特别是如果你想要一个计时器,周期很重要,你不想这样做.

使用常量指定时间间隔循环的正确方法是这样做:

loop do
  t = Time.now
    #... content of the loop
  sleep(t + 1 - Time.now)
end
Run Code Online (Sandbox Code Playgroud)