私はいくつかのサイトのデータを一度に集約するクラスを作成しています。それは、すべてのサイトに並行してリクエストを発行し、結果を収集し、呼び出し元に返す必要があります。 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つの問題があります。
はそれが薄いの下で動作するように取得する方法はあります? Thinはすでにイベントループを持っているので、上記のようにマルチリクエストの完了時のブロックは決して終了しません。しかし、私はまだマルチリクエストの完了時にブロックしてから
aggregate
に戻ることを望みます。言い換えれば、私はEventMachine内のEventMachineが必要です。ポーリングは決して答えではありません。それを書くための他の方法はありますか?