【问题标题】:Perform a loop for a certain time interval or while condition is met在一定的时间间隔或满足条件时执行循环
【发布时间】:2013-04-09 03:22:39
【问题描述】:

我试图在 30 秒内每秒触发一次检查。我还没有找到一个明确的方法来用 Ruby 做到这一点。目前正在尝试这样的事情:

until counter == 30
  sleep 1
  if condition
    do something
    break
   else
     counter +=1
end

类似的问题是它必须使用睡眠,这会使线程在其轨道上停止整整一秒钟。有没有另一种方法可以在不使用睡眠的情况下实现与上述类似的事情?有没有办法让某些东西在基于时间的间隔上循环?

【问题讨论】:

  • 去掉计数器变量并使用for i in 1..301.upto(30)(1..30).each
  • 您在等待时希望对线程做什么?如果您正在尝试检查 IO,则可能需要查看 IO#select 之类的内容,如果不存在则执行其他操作。从上面的代码中不清楚是否还有其他处理要做。只是睡觉本身并没有什么错。
  • 抱歉问题含糊不清。我正在运行一个基于事件的机器人,它是事件驱动/多线程的。我想检查触发循环的事件的 30 秒窗口内是否发生条件。我想在那 30 秒内经常进行检查(1 秒或 os 间隔)。条件在另一个事件中更新/发生,我希望此循环根据该条件发生/未发生检查并执行反应。
  • SLeep 导致一些延迟/无法触发此循环所在的事件。事件本身有许多条件导致不同的响应,这就是我不想使用 slleep 路由的原因。跨度>

标签: ruby loops time ruby-1.9 ruby-2.0


【解决方案1】:

您可以通过以下方式大致了解您正在寻找的内容:

now = Time.now
counter = 1
loop do
  if Time.now < now + counter
    next
  else
    puts "counting another second ..."
  end
  counter += 1
  break if counter > 30
end

【讨论】:

  • 我认为这实际上完成了我打算做的事情,我不知道将整数值添加到时间相当于将秒数添加到时间。谢谢
  • 这比睡觉更糟糕,因为它会固定你的 CPU。
【解决方案2】:

你可以做一些简单的事情,比如..

max_runtime = 10.seconds.from_now
puts 'whatever' until Time.now > max_runtime

【讨论】:

    【解决方案3】:

    你可以试试这个,它允许间隔控制

    counter == 30
    interval = 5 # Check every 5 seconds
    interval_timer = 1 # must start at 1
    now = Time.now
    while Time.now - now < counter
        if interval_timer % interval == 0 #Every 5 attempts the activity will process
            if condition
                stuff
            end
        end
        process_timer = process_timer + 1
    end
    

    这将在保证 30 秒内发生,间隔可以设置为 1 或更大的任何值。有些事情通过毫秒处理,这将为您提供一个选项,可以节省您的处理周期。在图形处理中效果很好。

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多