私は、解析するWebページを取得したいが、I/Oが行われている間はCPUをブロックしないと言っている。 PythonのEventletライブラリに相当するものはありますか?Rubyで非ブロックI/Oを実行するための好ましい方法は何ですか?
8
A
答えて
5
私はEventletとは何か分かりませんが、RubyにはノンブロッキングIO(amongst other things)用のライブラリEventMachineがあります。
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. Ruby - IFブロック内で何かを実行してからブレークする方法は?
- 2. WPF GUIスレッドでコードを実行するための好ましい方法は何ですか?
- 3. なぜ非同期IOが好ましいですか
- 4. GTKアプリケーションを書くための好ましい方法は何ですか?
- 5. ioの実用は何ですか? Clojureのブロック?
- 6. 非メインスレッドで非同期ioとdo ioの違いは何ですか?
- 7. DynamicObjectの不足しているメンバーを処理するための好ましい方法は何ですか?
- 8. 単純な言葉で、IOとノンブロッキングIOをブロックするのは何ですか?
- 9. Wicketでサイトテンプレートとテーマを実行するのに好ましい方法は何ですか?
- 10. Rubyでは、何が技術的に - ブロックなしでarray.rejectまたはarray.selectを実行しますか?
- 11. 親ウィンドウをカスタマイズされたコントロールから通知するための好ましい方法は何ですか?
- 12. 非同期サーブレットとファイルをダウンロードするための非ブロックIOの使用方法は?
- 13. UIレビューを実行するための良い方法は何ですか?
- 14. メディアクエリーをHTMLに含めるための好ましい方法は何ですか?
- 15. Androidの非ブロックIO
- 16. OCamlプロジェクトを構築して構築するための好ましい方法は何ですか?
- 17. FilewatcherはJavaのIOを非ブロックと見なしますか?
- 18. Rails 3で空のJSONレスポンスを返すための好ましい方法は何ですか?
- 19. IO/Ruby on Railsをブロックする
- 20. MonoTouchプロジェクトのOSS依存関係を管理するための好ましい方法は何ですか?
- 21. Artifactoryにアーティファクトをアップロードするための好ましい方法は何ですか?
- 22. Mocha Expectation(Ruby)でブロック内の何かをfreerangeに渡す方法
- 23. RailsでHTMLタグを生成する好ましい方法は何ですか?
- 24. 拡張メソッドのIEnumerable <T>をチェーン化するための好ましい(実行可能で可読な)方法は何ですか?
- 25. これを実行するための最良の方法は何ですか?非同期
- 26. 「ガード」を書くための好ましい方法はどれですか?
- 27. Rubyでブロックを実行していないブロックがあるかどうかを確認します
- 28. Rubyのネームスペースに名前を付けるための好ましい方法(より良いスタイル)は何ですか?単数形か複数形か?
- 29. Pythonでフックやコールバックを実装するのに好ましい方法は何ですか?
- 30. 新しいスレッドを作成するためのアンドロイドの好きな方法は何ですか?
hydra.runの呼び出しがブロックしていると言うと、スリープ状態に留まり、I/Oが完了すると呼び出されます。これは、WindowsのイベントドリブンI/Oと同様に、私が達成しようとしていることです。 hydra.runの呼び出しが行われるスレッドは、ブロックされている間はCPUを使用せずにすべきです。なぜなら、本質的にイベントを待っているからです。それがヒドラの仕組みですか?もしそうでなければ、私はそれがその目的を敗北させると思うだろう。あなたが確認できるなら、私はこれを受け入れたものとしてマークします。ありがとう。 –
それはどのように動作する、忙しい待っていることはありません。 – Theo
私の場合は、現在のスレッドを解放し、ブロックしないでください。ブロックする 'hydra.run'呼び出しを避ける方法はありますか?完全にノンブロッキングのアプローチをサポートする他のHTTPルビーの宝石はありますか? –