2012-03-15 2 views
1

私はいくつかのサイトのデータを一度に集約するクラスを作成しています。それは、すべてのサイトに並行してリクエストを発行し、結果を収集し、呼び出し元に返す必要があります。 aggregateメソッドが戻るまでに、すべての呼び出しが完了している必要があります。EventMachine :: Multiリクエストでブロックする

また、メソッドはRailsコントローラのコンテキストで実行され、イベントが発生したWebサーバーで実行されている場合と実行されていない場合があります。

コードの純粋な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 

であるように私は、コードには2つの問題があります。

  1. はそれが薄いの下で動作するように取得する方法はあります? Thinはすでにイベントループを持っているので、上記のようにマルチリクエストの完了時のブロックは決して終了しません。しかし、私はまだマルチリクエストの完了時にブロックしてからaggregateに戻ることを望みます。言い換えれば、私はEventMachine内のEventMachineが必要です。

  2. ポーリングは決して答えではありません。それを書くための他の方法はありますか?

答えて

2

私は頑固なことをやめて試しましたTyphoeus。このシナリオでは、が正しく動作します。ここで言及した別のスレッドとして、非同期呼び出しをブロックすることは、両方の世界の中で最悪です。

関連する問題