Надежны ли таймеры рельсов при использовании Net :: HTTP? - PullRequest
0 голосов
/ 11 марта 2010

При чтении данных с потенциально медленного веб-сайта я хочу убедиться, что get_response не может зависнуть, и поэтому добавил таймер для тайм-аута через x секунд. Все идет нормально. Затем я читаю http://ph7spot.com/musings/system-timer, что показывает, что в некоторых ситуациях timer.rb не работает из-за реализации потоков в ruby.

Кто-нибудь знает, относится ли это к одной из этих ситуаций?

url = URI.parse(someurl)

begin
    Timeout::timeout(30) do 
        response = Net::HTTP.get_response(url)
        @responseValue = CGI.unescape(response.body)
    end 
rescue Exception => e 
    dosomething
end

1 Ответ

0 голосов
/ 12 марта 2010

хорошо, во-первых, Timeout - это не класс, определенный в Rails, но во-вторых, Timeout не надежен в случаях, когда вы делаете системные вызовы.

Руби использует так называемые зеленые потоки. Предположим, у вас есть 3 потока, вы думаете, что все они будут работать параллельно, но если один из потоков сделает системный вызов, все остальные потоки будут заблокированы, пока системный вызов не завершится, в этом случае Timeout не будет работать должным образом, поэтому всегда лучше использовать что-нибудь надежное, например, SystemTimer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...