2016-07-15 5 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

を使用することができます。timeの単位について

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

わかりません。それに応じて条件time > 30を調整してください。

+0

あまりにもOPが彼が望むなら実際にメソッドを中断したり、事実の後にループから抜けたりすることができます。 :/ – AnoE

3

コードは、あなたはすでに、特にいくつかのTimeoutに関して、いくつかの答えを得た

1

実行に時間がかかる場合、これはTimeout::TimeoutErrorが発生しますTimeout

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

使用STDLIB。

ここで注意してください。 Timeoutは、標準RubyでALARM信号を用いて実装されて

  • を意味し、(つまり、私はここにJRubyの話ではない)はネストできませんタイムアウト(それはあなたができる、ですが、それは静かに失敗します)。
  • あなたのコードやいくつかの宝石もALARM信号を使用していると、間違っています。
  • このような厄介なメカニズムであるため、状況が間違っている(予期しない動作)可能性があります。
  • 大きな頭痛を覚えていない限り、標準的なルビーの「グリーンマルチスレッド」と混同しないでください。

可能であれば、何とか自分のタイムアウトを自分で行う方が安全です。つまり、できれば、methodに定期的に費やされた時間をチェックしてください。もちろん、これはあなたにとって有用かもしれません。テストコードをプロダクションコードに組み込むことは望ましくありません。また、システムコールをタイムアウトさせたい場合(たとえば、ネットワークコールをブロックするなど)には、難しい場合があります。

少なくとも、心に留めておいてください。

関連する問題