如何延迟 Ruby 中的循环?

How to put a delay on a loop in Ruby?

例如,如果我想制作一个计时器,我该如何在循环中进行延迟以使其以秒为单位计数而不是仅以毫秒为单位循环?

以上 'comment' 是您的答案,鉴于您提出的非常简单直接的问题:

1.upto(5) do |n|
  puts n
  sleep 1 # second
end

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

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

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

以固定指定时间间隔循环的正确方法是这样做:

loop do
  t = Time.now
    #... content of the loop
  sleep(t + 1 - Time.now)
end