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

太糟糕了OP沒有指定他是否想要實際上中斷了這個方法,或者只是在事實之後跳出循環。 :/ – AnoE

3

使用STDLIB Timeout

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

這將提高Timeout::TimeoutError如果代碼需要運行較長時間

1

你已經得到了幾個答案,特別是一些關於Timeout

請注意這裏。 Timeout與標準紅寶石報警信號來實現(即,我不是在談論的JRuby在這裏),這意味着

  • 不能嵌套超時(也就是,你可以,但它會悄悄地失敗)。
  • 如果您的代碼或某些寶石也使用了ALARM信號,則會出錯。
  • 由於它是如此笨拙的機制,事情可能會發生明顯的錯誤(意外的行爲)。
  • 甚至不要嘗試將它與標準紅寶石的「綠色多線程」混合使用,除非您喜歡令人頭疼的問題。

如果可以的話,自己總是會更安全一些。也就是說,如果可以的話,請讓你的method檢查定期花費的時間。當然,這對你可能有用也可能沒用。你不想把測試內容帶入你的生產代碼。如果您想暫停系統調用(例如阻止網絡呼叫),可能很難。

至少要記住。

相關問題