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

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

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)

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 
 Matthew O'Riordan18 авг. 2016 г., 17:01
Тайм-аут действительно отстой, но этот многопоточный подход работает хорошо, спасибо
 Abhishek Patel29 сент. 2016 г., 09:28
или попробуйте soft_timeouthttps://github.com/abhi-patel/soft_timeout
 rogerdpack19 сент. 2012 г., 16:08
Timeout :: timeout снова сосет ...
 John Bachir19 сент. 2012 г., 21:45
Я недавно описал и, возможно, исправил эту проблему здесь:code.jjb.cc/2012/09/15/...

документация:

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

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

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

Решение Вопроса

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

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

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

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

 Pasta09 янв. 2011 г., 03:42
Вы были окончательно правы. Я не знаю, почему я не проверял platform.search. На самом деле, поиск спасал .. Исключение ... Спасибо большое!

Ваш ответ на вопрос