Ruby Timeout :: timeout не вызывает исключение и не возвращает то, что задокументировано - PullRequest
9 голосов
/ 09 января 2011

у меня есть этот кусок кода:

begin
  complete_results = Timeout.timeout(4) do      
    results = platform.search(artist, album_name)
  end
rescue Timeout::Error
  puts 'Print me something please'
end 

Затем я запускаю метод, содержащий этот код, и вот начало трассировки стека:

Exception message :  execution expired
Exception backtrace :  /***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i

Так что я наивно думаю, что мой звонок засчитан. Но «Напечатай мне что-нибудь, пожалуйста» никогда не печатается, и complete_results, которое, как предполагается, будет возвращаемым значением времени ожидания (истина или ложь, как упомянуто в документации), определенно не является логическим значением.

Я что-то не так делаю?

Ответы [ 3 ]

20 голосов
/ 09 января 2011

Ваш код правильный

require 'timeout'
begin
  complete_results = Timeout.timeout(1) do      
   sleep(2)
  end
rescue Timeout::Error
  puts 'Print me something please'
end

распечатывает «напишите мне что-нибудь, пожалуйста».

Попробуйте базовый код, как указано выше. Если это работает, у вас есть проблема в platform.search.

4 голосов
/ 14 мая 2012

Проблема в том, что platform.search ловит исключение, Timeout#timeout throws.

Вы можете обойти это, обернув свой внутренний код в другой поток - YMMV.

begin
  complete_results = Timeout.timeout(4) do
    Thread.new{ results = platform.search(artist, album_name) }.value
  end
rescue Timeout::Error
  puts 'Print me something please'
end 
1 голос
/ 09 января 2011

Согласно документации :

Если выполнение блока прекращается до того, как прошло секунд возвращает истину. Если нет, он заканчивается исполнение и вызывает исключение (по умолчанию Timeout :: Error)

Это означает, что он возвращает true только в случае успеха, в противном случае переменная не будет установлена ​​(т. Е. Nil NOT NOT).

Что касается вашего примера, для меня определенно истекает время и начинается спасательная часть ...

...