【问题标题】:Tell Ruby Program to Wait some amount of time告诉 Ruby 程序等待一段时间
【发布时间】:2010-11-22 17:34:00
【问题描述】:

如何让 Ruby 程序在继续执行下一行代码之前等待任意时间?

【问题讨论】:

    标签: ruby sleep


    【解决方案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】:

    这是使用sleepsidekiq 的示例

    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的时候。
          猜你喜欢
          • 2020-07-16
          • 2022-07-23
          • 1970-01-01
          • 2019-01-15
          • 2010-11-08
          • 2021-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多