如何延迟 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
例如,如果我想制作一个计时器,我该如何在循环中进行延迟以使其以秒为单位计数而不是仅以毫秒为单位循环?
以上 '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