Ruby EventMachine と em-http-request を使用して、異なるスレッドからトリガーされた並列 HTTP同期要求を実行したいと考えています。
アイデアは、EM.next_tick のおかげで、単一のリアクターを独自のスレッドで実行し、HTTP 要求をイベント キューで完了するようにプッシュすることです。
すべての呼び出しのパターンは次のようになります
def complete_request(url, options)
Thread.new { EM.run } unless EM.reactor_running?
EM.run do
EM.next_tick do
con = EventMachine::HttpRequest.new(url, options[:connection_headers])
http = com.setup_request(verb, head: options[:headers], body: options[:body])
http.errback { }
http.callback { }
end
end
# wait for request completion (but how?)
...
end
reqs = []
responses = []
reqs << Thread.new { responses << complete_request('http://www.stackoverflow.com', verb: get) }
reqs << Thread.new { responses << complete_request('http://www.flickr.com', verb: get) }
reqs.each { |req| req.join }
リクエストを同期させるために、ファイバーを使用しようとしましたが、失敗しました。要求が接続に失敗するか、要求は完了しますがイベント ループを終了しません。
コールバックで EM.stop を呼び出したくありません。これは、並行して実行されている他のリクエストが台無しになるためです。また、リアクターを実行したいときに、これ以上リクエストを処理する必要がないと判断するまでリアクターを停止することにもなります。
EventMachine と em-http-request をこの方法で使用しようとしている人はいますか? EventMachine はこのユースケースをサポートできますか?