2010-12-17 5 views

답변

17

Ruby를위한 최상의 HTTP 클라이언트 라이브러리는 Typhoeus이며 비 차단 방식으로 여러 HTTP 요청을 병렬로 수행하는 데 사용할 수 있습니다.

# blocking 
response = Typhoeus::Request.get("http://stackoverflow.com/") 
puts response.body 

# non-blocking 
request1 = Typhoeus::Request.new("http://stackoverflow.com/") 
request1.on_complete do |response| 
    puts response.body 
end 
request2 = Typhoeus::Request.new("http://stackoverflow.com/questions") 
request2.on_complete do |response| 
    puts response.body 
end 
hydra = Typhoeus::Hydra.new 
hydra.queue(request1) 
hydra.queue(request2) 
hydra.run # this call is blocking, though 

또 다른 옵션은 em-http-request입니다 EventMachine의 상단에서 실행 차단 및 비 차단 인터페이스가있다. 그것은 완전히 비 블로킹 인터페이스를 가지고 있습니다 :

EventMachine.run do 
    request = EventMachine::HttpRequest.new('http://stackoverflow.com/').get 
    request.callback do 
    puts request.response 
    EventMachine.stop 
    end 
end 

Typhoeus Hydra와 마찬가지로 많은 요청을 병렬로 처리 할 수있는 인터페이스가 있습니다.

em-http-request의 단점은 EventMachine과 관련되어 있다는 것입니다. EventMachine은 그 자체로 멋진 프레임 워크이지만 모든 것이 든 아니든 상관 없습니다. 당신은 사건/연속 - 통과 스타일 방식으로 전체 응용 프로그램을 작성해야하며, 그것은 뇌 손상을 일으키는 것으로 알려져 있습니다. Typhoeus는 이미 발생하지 않은 응용 프로그램에 훨씬 더 적합합니다.

+1

hydra.run 호출이 블로킹 중이라고 말하면, 슬립 상태로 남아 있고 입출력이 완료되면 깨어납니다. 이것은 Windows에서 이벤트 구동 I/O와 같이 내가 달성하고자하는 것입니다. hydra.run 호출이 수행되는 스레드가 차단 되더라도 CPU를 사용하지 않아야합니다. 본질적으로 이벤트를 기다리고 있기 때문입니다. 그게 히드라가 작동하는 방법인가요? 그렇지 않다면, 나는 그것을 일종의 목적에 어긋나게 생각합니다. 당신이 확인할 수 있다면, 나는 이것을 인정 된 것으로 표시 할 것입니다. 감사. –

+1

그것이 작동하는 방법입니다. 바쁜 대기는 계속 진행되지 않습니다. – Theo

+0

제 경우에는 현재 스레드를 해제하고 전혀 차단하지 않아야합니다. 'hydra.run'호출을 차단하는 방법이 있습니까? 완전히 비 차단 방식을 지원하는 다른 HTTP 루비 보석이 있습니까? –

관련 문제