2010-03-11 3 views
0

잠재적으로 느린 웹 사이트에서 데이터를 읽을 때 get_response가 중단되지 않도록하고 x 초 후에 시간 초과되도록 타이머를 추가하려고합니다. 여태까지는 그런대로 잘됐다. 그런 다음 특정 상황에서 timer.rb가 루비의 스레드 구현으로 인해 작동하지 않는다는 것을 보여주는 http://ph7spot.com/musings/system-timer을 읽습니다.Net :: HTTP를 사용할 때 레일 타이머가 안정적입니까?

이 상황 중 하나인지 아는 사람이 있습니까?

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 
+0

어떻게 든 내 코드 예제는 munged되었습니다. – Frank

+0

해결되었습니다. 모든 코드는 4 (4) 개의 공백으로 들여 쓰기해야합니다. 루비 규칙에서 –

+0

은 들여 쓰기에 2 (2) 개 공백입니다. – shingara

답변

0

아니라, 모든 시간 제한의 첫 번째는 레일이 아니라 루비에 정의 된 클래스가 아닌 당신이 시스템 호출을 할 때, 둘째, 제한 시간은 경우에 신뢰할 수 없습니다.

루비는 소위 그린 스레드 (Green Threads)를 사용합니다. 3 개의 스레드가 있다고 가정 해 봅시다. 모든 스레드가 병렬로 실행됩니다.하지만 스레드 중 하나가 시스템 콜을 수행하면 시스템 콜이 완료 될 때까지 나머지 스레드가 모두 차단됩니다.이 경우 타임 아웃은 예상대로 작동하지 않습니다. 그래서 SystemTimer와 같은 안정적인 것을 사용하는 것이 항상 좋습니다.

+0

녹색 스레드 차단 문제를 이해합니다. 제 질문은 Net :: HTTP.get_response가 실제로 차단되는 시스템 호출을 만들고 그래서 (timeout.rb에서와 같이) 타이머가 작동하지 않도록하는 것입니다. 나는 그 대답이 '그렇다'라고 생각하지만, 나를 놀라게 한 것은 일반적으로 이것은 우려로 간주되지 않는다는 것이다. Systemtimer gem을 사용하는 코드 예제는 없습니다. 아니면 제가 놓친 뭔가가 있습니까? – Frank

+0

까지 내가 대답을 네, Net :: HTTP.get_response, 그래서 그것을 차단 시스템 호출을 알고 있습니다. – raf

관련 문제