告诉 Ruby 程序等待一段时间
Posted
技术标签:
【中文标题】告诉 Ruby 程序等待一段时间【英文标题】:Tell Ruby Program to Wait some amount of time 【发布时间】:2010-11-22 17:34:00 【问题描述】:如何让 Ruby 程序在继续执行下一行代码之前等待任意时间?
【问题讨论】:
【参考方案1】:我发现until
对睡眠非常有用。示例:
> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
> # or
> sleep 2 and puts 'still sleeping' until Time.now > time + 10
> # or
> sleep 1.seconds until !req.loading # suggested by ohsully
【讨论】:
这和sleep(10.seconds)
是一回事
是的,这里是一样的,因为它使用与 sleep 相同的输入(时间)。我想强调until
是如何用来睡觉的,直到达到任何条件(也喜欢语法的自然感觉)
这让我头疼。您能否提供一个与此不同的示例来展示在此处使用until
而不仅仅是sleep(10.seconds)
的价值?
假设你想阻塞直到请求返回:sleep 1.seconds until !req.loading
这与 sleep(10) 不完全相同。内核可能会提前唤醒线程。因此,如果您必须至少睡 10 秒,则需要这样的构造。见apidock.com/ruby/Kernel/sleep【参考方案2】:
这是使用sleep
和sidekiq
的示例
require 'sidekiq'
class PlainOldRuby
include Sidekiq::Worker
def perform(how_hard="super hard", how_long=10)
sleep how_long
puts "Workin' #how_hard"
end
end
睡眠 10 秒,打印出"Working super hard"
。
【讨论】:
这里写的是 (sin²?+cos²?) 而不是 1。【参考方案3】:这样
sleep(no_of_seconds)
或者您可以传递其他可能的参数,例如:
sleep(5.seconds)
sleep(5.minutes)
sleep(5.hours)
sleep(5.days)
【讨论】:
【参考方案4】:秒/分钟/小时的实现,这是rails方法。请注意,不需要隐式返回,但它们看起来更干净,所以我更喜欢它们。我不确定 Rails 是否有 .days 或是否更进一步,但这些是我需要的。
class Integer
def seconds
return self
end
def minutes
return self * 60
end
def hours
return self * 3600
end
def days
return self * 86400
end
end
在此之后,您可以执行以下操作:
sleep 5.seconds
休眠 5 秒。你可以通过sleep 5.minutes
睡 5 分钟。你可以做sleep 5.hours
睡5个小时。最后,您可以使用sleep 5.days
睡 5 天...您可以添加任何返回 self * 值的方法(该时间范围内的秒数)。
作为练习,尝试实施几个月!
【讨论】:
【参考方案5】:像这样:
sleep(num_secs)
num_secs
值可以是整数或浮点数。
此外,如果您在 Rails 应用程序中编写此代码,或者在项目中包含 ActiveSupport 库,则可以使用以下便捷语法构造更长的间隔:
sleep(4.minutes)
# or, even longer...
sleep(2.hours); sleep(3.days) # etc., etc.
# or shorter
sleep(0.5) # half a second
【讨论】:
【参考方案6】:sleep 6
将休眠 6 秒。对于更长的持续时间,您还可以使用sleep(6.minutes)
或sleep(6.hours)
。
【讨论】:
不确定对此的反对意见,但可能是minutes()
和 hours()
是 Ruby on Rails 添加的数字方法 - 因此在 Ruby 中不是标准可用 - 在 ActiveSupport::时长类。不过它们很方便。
我认为投反对票的主要原因是@vijaya_chowdary 基本上在 8 年后重新发布了投票的正确答案。我认为这至少很奇怪......
我对此投了反对票。这不是标准的红宝石。【参考方案7】:
像这样使用sleep:
sleep 2
它会休眠 2 秒。
小心地给出一个论点。如果你只是运行sleep
,进程将永远休眠。 (当您希望线程休眠直到唤醒时,这很有用。)
【讨论】:
等等,它会永远沉睡,还是直到它“醒来”? “醒”到底是什么意思? @anthropomorphic 指的是另一个线程调用Thread#run的时候。 其实我猜是当另一个线程调用Thread#wakeup的时候。以上是关于告诉 Ruby 程序等待一段时间的主要内容,如果未能解决你的问题,请参考以下文章