2016-07-15 3 views
0

я протестированные время выполнения методаперерыв, если метод занимает более 30 секунд времени, чтобы выполнить

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

def method(test) 
    code 
end 

Который возвращается время в секундах

Но то, что я хочу, чтобы разорвать петлю, если этот метод используя более 30 секунд времени выполнения.

предлагает чистый способ сделать это.

+1

Использовать 'Тайм-аут': http://ruby-doc.org/stdlib-2.3.1/libdoc/timeout/rdoc/Timeout.html –

+0

Спасибо, это очень полезно –

ответ

1

Вы можете использовать метод Ruby Timeout

require 'timeout' 

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

Попробуйте это:

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

Не уверен единицы time. Отрегулируйте условие time > 30 в соответствии с этим.

+0

Слишком плохо, что ОП не уточнил, хочет ли он чтобы фактически прервать метод или просто выйти из цикла после факта. : / – AnoE

3

Использование STDLIB Timeout

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

Это поднимет Timeout::TimeoutError если код занимает больше времени, чтобы запустить

1

Вы уже получили несколько ответов, особенно некоторые относительно Timeout.

Пожалуйста, будьте осторожны. Timeout осуществляется с сигналом ТРЕВОГА в стандартном рубина (то есть, я не говорю о JRuby здесь), что означает

  • Вы не можете вкладывать таймауты (то есть, вы можете, но он будет молча терпеть неудачу).
  • Если ваш код или какой-либо драгоценный камень также используют сигнал ALARM, это пойдет не так.
  • Все может поступить неправильно (неожиданное поведение) из-за того, что это такой неуклюжий механизм.
  • Не пытайтесь смешивать его с «зеленым многопоточным» стандартным рубином, если вам не нравятся серьезные головные боли.

Если вы можете, то всегда будет безопаснее как-то делать свой тайм-аут самостоятельно. То есть, если вы можете, то у вас есть method проверка на время, проведенное регулярно. Конечно, это может быть или не быть полезным для вас; вы не хотите приносить тестовые материалы в ваш производственный код. И может быть сложно, если вы хотите тайм-аут системных вызовов (например, блокирование сетевых вызовов).

По крайней мере, имейте это в виду.

Смежные вопросы