2011-01-09 10 views
9

mam ten fragment kodu:Ruby Timeout :: Timeout nie robi wyjątków ogień i nie wrócić, co udokumentowane

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

I wtedy uruchomić metodę zawierającą ten kod, i dobrze, tutaj jest początkiem śledzenia stosu:

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

Więc naiwnie sądzę, że moje połączenie zostało przekroczone. Ale "Wydrukuj mi coś proszę" nigdy nie jest drukowane, a complete_results, która ma być wartością zwracaną przez timeout (true lub false, jak wspomniano w dokumentacji), nie jest definiująca wartością boolowską.

Czy robię coś nie tak?

Odpowiedz

19

Twój kod jest poprawny

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

ma wydrukować "wydrukować mi coś proszę".

Wypróbuj podstawowy kod jak powyżej. Jeśli to działa, masz problem z numerem platform.search.

+0

Zostałeś definitywnie słuszny. Nie wiem, dlaczego nie sprawdziłem platformy. Właściwie szukanie ratowało ... Wyjątek ... Wielkie dzięki! – Pasta

1

Według the documentation:

Jeżeli wykonanie bloku kończy przed sek sekund minęło, to zwraca true. Jeśli nie, to kończy wykonanie i podnosi wyjątek (który domyślnie do Timeout :: Error)

Oznacza to, że tylko zwraca true jeśli jest to sukces, inaczej zmienna nie zostanie ustawiona (tzn to nil NIE fałszywy).

O ile Twój przykład idzie, to zdecydowanie rozrządu dla mnie i dotarcie do części ratunkowej ...

4

Problemem jest to, że platform.search łapie tą różnicą, że Timeout#timeout throws.

Możesz obejść ten problem, zawijając swój wewnętrzny kod w innym wątku - 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

Limit czasu :: limit czasu znów jest do bani ... – rogerdpack

+2

Ostatnio opisałem i prawdopodobnie naprawiłem ten problem, tutaj: http://code.jjb.cc/2012/09/15/sane_timeout-a-replacement-for-rubys- standardowy-biblioteka-timeout/ –

+0

Limit czasu nie jest zasysany, ale to podejście wątkowe działa dobrze, dzięki –