如果方法执行时间超过30秒,则中断

时间:2016-07-15 11:02:59

标签: ruby-on-rails ruby loops

我对方法

的执行时间进行了基准测试
tests.each do |test|
  time = Benchmark.realtime { method(test) }
end

def method(test)
   code
end

以秒为单位的返回时间

但我想要的是,如果这个方法的执行时间超过30秒,就会打破循环。

建议一个干净的方法来做。

4 个答案:

答案 0 :(得分:3)

使用stdlib Timeout

require 'timeout'
def method(test)
  Timeout::timeout(30){
    #code here
  }
end

如果代码运行时间更长,则会引发Timeout::TimeoutError

答案 1 :(得分:1)

您可以使用Ruby Timeout方法

require 'timeout'

tests.each do |test|
  Timeout::timeout(30) {
    method(test)
  }
end

答案 2 :(得分:1)

您已经获得了多个答案,特别是有关Timeout的答案。

请谨慎。 method是用标准ruby中的ALARM信号实现的(即我这里不是在讨论JRuby),这意味着

  • 你不能嵌套超时(也就是说,你可以,但它会默默地失败)。
  • 如果您的代码或某些宝石也使用ALARM信号,则会出错。
  • 由于它是如此笨重的机制,事情可能显然是错误的(意外行为)。
  • 甚至不要尝试将它与绿色多线程"混合使用。标准红宝石,除非你喜欢头疼。

如果可以,以某种方式自行完成超时总是更安全。也就是说,如果可以,那么请: integer expression expected : integer expression expected OK: 3 检查定期花费的时间。当然,这可能对你有用,也可能没用;您不想将测试内容带入您的生产代码中。如果你想超时系统调用(例如,阻止网络调用),可能会很难。

至少,记住它。

答案 3 :(得分:-2)

试试这个:

tests.each do |test|
  time = Benchmark.realtime { method(test) }
  break if time > 30
end

不确定time的单位。根据该条件调整条件time > 30