2010-12-17 6 views

答えて

17

Ruby用の最高のHTTPクライアントライブラリはTyphoeusです。非ブロック的な方法で複数のHTTPリクエストを並行して実行するために使用できます。ブロッキングとノンブロッキング・インタフェースがあります:

# blocking 
response = Typhoeus::Request.get("http://stackoverflow.com/") 
puts response.body 

# non-blocking 
request1 = Typhoeus::Request.new("http://stackoverflow.com/") 
request1.on_complete do |response| 
    puts response.body 
end 
request2 = Typhoeus::Request.new("http://stackoverflow.com/questions") 
request2.on_complete do |response| 
    puts response.body 
end 
hydra = Typhoeus::Hydra.new 
hydra.queue(request1) 
hydra.queue(request2) 
hydra.run # this call is blocking, though 

別のオプションは、EventMachineの上で実行em-http-request、です。それは完全に非ブロックのインターフェースを持っています

EventMachine.run do 
    request = EventMachine::HttpRequest.new('http://stackoverflow.com/').get 
    request.callback do 
    puts request.response 
    EventMachine.stop 
    end 
end 

同様Typhoeusハイドラに、並列に多くの要求を行うためのインタフェースもあります。

em-http-requestの欠点は、それがEventMachineに結びついていることです。 EventMachineはそれ自体素晴らしいフレームワークですが、それはすべてかどうかの契約です。あなたは、あなたの全体のアプリケーションを、イベント/継続型スタイルで書く必要があり、それは脳の損傷を引き起こすことが知られています。 Typhoeusは、まだ起こっていないアプリケーションにはるかに適しています。

+1

hydra.runの呼び出しがブロックしていると言うと、スリープ状態に留まり、I/Oが完了すると呼び出されます。これは、WindowsのイベントドリブンI/Oと同様に、私が達成しようとしていることです。 hydra.runの呼び出しが行われるスレッドは、ブロックされている間はCPUを使用せずにすべきです。なぜなら、本質的にイベントを待っているからです。それがヒドラの仕組みですか?もしそうでなければ、私はそれがその目的を敗北させると思うだろう。あなたが確認できるなら、私はこれを受け入れたものとしてマークします。ありがとう。 –

+1

それはどのように動作する、忙しい待っていることはありません。 – Theo

+0

私の場合は、現在のスレッドを解放し、ブロックしないでください。ブロックする 'hydra.run'呼び出しを避ける方法はありますか?完全にノンブロッキングのアプローチをサポートする他のHTTPルビーの宝石はありますか? –

関連する問題