2011-11-12 5 views
2

私はRubyサーバから外部RESTful APIに非同期でアクセスするためにRubyのEventMachineライブラリを使用しています。私のサーバーを通じて利用できるメソッドの1つは、複数の外部APIにアクセスし、応答を集約してから自分のサーバーにアクセスするクライアントに応答を返すことです。ここで私が今やっていることは...EventMachineからの複数の非同期コールバック - それを処理するより良い方法はありますか?

def aggregate 
    responses = Array.new 
    done  = 0 

    # clients are EM::Deferrable objects... 
    clients.each do |client| 
    client.callback do |response| 
     responses << response 
     done += 1 
    end 

    client.errback do |response| 
     done += 1 
    end 
    end 

    until done == clients.length 
    sleep 1 
    end 

    return responses 
end 

このような状況を処理するには、より良い方法がありますか? EventMachineのバージョン1.0.0で出荷されるEM :: Completionクラスが、このようなユースケースをよりよくサポートする配管を提供する可能性はありますか?

私はこの問題が(StackOverflowで同様の質問を見つけることはできませんでしたが)先に出てきたと確信していますので、他の人がこの問題にどのように近づいてきたのかは興味があります。

答えて

3

まず、sleepを使用すると、EventMachineの目的が完全に無効になります。イベントループをブロックしています。より良い方法を提案するためにはもっと大きな図が必要ですが、すべての要求が完了する前にメソッドが返されるという事実に慣れてください。また、Rubyのファイバー(あなたにとって透過的)で手続き型のイベントプログラミングを行う方法についてはem-synchronyを見てください。

複数のリクエストを同時に実行するためのグルーコードを減らす1つの方法は、em-http-requests multi interfaceのようなものを使用することです。これはEventMachineのコールバック方法とem-synchronyの両方で機能します。

EM :: Completionは拡張されたDeferrableのほうが多く、このケースではあなたを正確には助けません。

+1

ありがとうroidrage、em-http-requestのMultiRequestクラスは、私が探していたタイプのものです。 – Bryan

関連する問題