2012-03-15 2 views
1

여러 사이트의 데이터를 한꺼번에 집계하는 클래스를 만들고 있습니다. 요청을 병렬로 모든 사이트에 보내고 결과를 수집 한 다음 호출자에게 반환해야합니다. aggregate 메서드가 반환 될 때까지 모든 호출이 완료되어야합니다.EventMachine :: Multi 요청에 대한 차단

또한이 메서드는 Rails 컨트롤러의 컨텍스트에서 실행되며, 이벤트가 발생한 웹 서버에서 실행 중이거나 실행 중이 아닐 수도 있습니다.

코드의 순수한 EM 기반 버전은 다음과 같이

class DataAggregator 
    def aggregate(artist) 
    multi = EventMachine::MultiRequest.new 

    EventMachine.run do 
     multi.add :a, EventMachine::HttpRequest.new("http://www.postrank.com").get 
     multi.add :b, EventMachine::HttpRequest.new("http://www.google.com").get 
     multi.add :c, EventMachine::HttpRequest.new("http://www.github.com").get 
     multi.add :d, EventMachine::HttpRequest.new("http://www.yahoo.com").get 
     multi.add :e, EventMachine::HttpRequest.new("http://www.facebook.com").get 

     multi.callback do 
     puts "Done!" 
     EventMachine.stop unless defined?(Thin) 
     end 
    end 

    # Not optimal, but I don't see any way to do this otherwise. 
    unless multi.finished? 
     sleep 0.1 
    end 
    end 
end 

내가 코드를 두 가지 문제가 있습니다

  1. 이 씬에서 행동 갈 수있는 방법이 있나요 ? Thin은 이미 이벤트 루프를 가지고 있기 때문에 다중 요청의 완료시 차단은 위에 쓴 것처럼 끝나지 않을 것입니다. 하지만 여전히 멀티 요청이 완료되면 차단하여 aggregate에서 돌아 오기를 원합니다. 즉, EventMachine 내에 EventMachine이 필요합니다.

  2. 폴링이 대답이 아닙니다. 거기에 다른 방법으로 쓸 수 있습니까?

답변

2

나는 고집을 피우고 시험해 보았다. Typhoeus. 이 경우에만 이 작동합니다. 여기서 언급 한 또 다른 스레드는 비동기 호출을 차단하는 것이 두 세계에서 최악의 경우입니다.