【问题标题】:Reset timer outside of loops在循环外重置计时器
【发布时间】:2018-10-29 12:31:48
【问题描述】:

我已经为我正在计时的功能设置了一个计时器,但希望它在满足条件后重置

timestart = Time.now

Individual.all.each do |f|

    endtime = Time.now
    timer = (endtime - timestart)

    puts timer #places the time it takes for each loop

    if checktime  == 1 then
        ###Apply new {timestart = Time.now} HERE?###
    end

end

所以在上面的例子中,我希望我的计时器在 1 分钟后重置

【问题讨论】:

  • 每 1 分钟后你到底想做什么?
  • 到了1分钟就重置timestart,从而重置定时器

标签: ruby-on-rails ruby loops time


【解决方案1】:

在一分钟后以类似 Rails 的简单方式重置您的问题的答案可能是:

timestart = Time.now

Individual.all.each do |f|

    endtime = Time.now
    timer = (endtime - timestart)

    puts timer #places the time it takes for each loop

    if timestart < 1.minute.ago
        timestart = Time.now
    end

end

但是,如果我们了解您为什么要以这种方式对循环进行基准测试,我们可能会更有帮助。为什么要每分钟重置一次计时器?

您也有此评论:places the time it takes for each loop。这在您的代码中并不完全正确,因为您没有在每个循环上重置 timestart。假设循环需要 1 秒。第一次迭代timer 将是“1 秒”。第二次timer 将是“2 秒”,即使循环迭代只花了一秒钟。

但你可能有你的理由:)

【讨论】:

  • 谢谢;我会试试的。我正在从限制为 600 个请求/5 分钟的 API 获取数据,因此我希望添加一个计时器,然后每 5 分钟暂停一次;计时器用于计算它需要暂停多长时间才能继续。如果有更好的方法可以做到这一点,我很想知道!
  • @JimBob 我希望您在后台工作人员中执行此操作,对吗?
【解决方案2】:

这里是你如何使用yield 来清理你的主要方法

@timestart = Time.now

def one_min_check 
  start_time = Time.now
  yield
  end_time = Time.now
  puts "Something took #{end_time - start_time} to run"
  if end_time - @timestart >= 60.0
    @timestart = end_time 
    puts "Took 1 minute or longer. Reset 1 min at #{@timestart}"
  end
end


Individual.all.each do |f|
   one_min_check do 
     #do stuff with f
   end
end

但为什么不只是用户基准测试呢?

require 'benchmark'

Individual.all.each do |f|
  puts Benchmark.measure do 
    #do stuff with f
  end
end

【讨论】:

    【解决方案3】:

    你可以计算出来。

    quantity = Individual.all.count
    time = Benchmark.measure { Post.all }
    
    time_per_each = time / quantity.to_f
    

    您得到的答案是以毫秒为单位,只需转换即可。

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      我自己想出来的:)

      刚刚放了

      timestart = Time.now
      

      在条件之间的循环。必须稍微更改代码以保持时间,但计时器会在此时重置以进行下一个循环:->

      真的很简单

      【讨论】:

        【解决方案5】:

        如果我对您正在尝试做的事情的理解是正确的:

        timestart = Time.now
        
        Individual.all.each do |f|
        
          puts Time.now-timestart #places the time it takes for each loop
        
          if Time.now-timestart < 60 # or some other condition of your choice
            timestart = Time.now
          end
        
        end
        

        应该很好地完成这项工作......

        但实际上,它不会在每个循环中重置 timestart

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-24
          • 2019-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多