2012-07-08 10 views
6

Ruby 1.9ではOSスレッドが使用されていますが、実際には1つのスレッドしか同時に実行されません(別のスレッドが処理している間に1つのスレッドがIOをブロックしている可能性があります)。私が見たスレッドの例は、新しいスレッドを起動するのにThread.newを使用するだけです。 Javaのバックグラウンドに由来して、私は通常、「ヘビー級」なので、多くの新しいスレッドを起動しないようにスレッドプールを使用します。Ruby 1.9スレッドプール

ルビにはスレッドプール構造が組み込まれていますか?私はデフォルトの言語ライブラリで1つも見ませんでした。または、通常使用される標準的な宝石はありますか? OSレベルのスレッディングはRubyの新しい機能なので、ライブラリがどの程度成熟しているのか分かりません。

答えて

6

デフォルトのC Rubyインタプリタは一度に1つのスレッドしか実行しません(Pythonなどの他のCベースの動的言語にも同様の制限があります)。この制限のため、Rubyではスレッディングがそれほど一般的ではないため、デフォルトのスレッドプールライブラリはありません。並行して実行するタスクがある場合、プロセスは複数のサーバーにまたがることがあるため、通常はプロセスを使用します。

スレッドを使用する必要がある場合は、JRubyプラットフォームでhttps://github.com/meh/ruby-threadpoolを使用することをお勧めします。これは、JVM上で動作するRubyインタプリタです。それはあなたの路地の上にあるはずです。仮想マシン上で実行されているため、本当のスレッディングがあります。

+0

ありがとうございました。私は実際にユースケースを実際には持っていませんが、私がピッカックスの本を読んでいたとき、これは私が確信していたものでしたが、あなたは明確にしました。 –

+12

Rubyではスレッドが同時に実行されていないため、スレッドが役に立たないと言及している間は分かりません。それらは実際にはCPUのバウンドタスクには役に立たないが、パラレルでやりたいIOのブロッキングに非常に役立つことがある。例えば。同時HTTPリクエスト。 – Kamchatka

+0

コメントありがとうございます。 Rubyではスレッドが無駄ではないことをさらに明確にする必要があります。スレッドはオーバーヘッドがないため、GILの制限を認識する必要があります。ノンブロッキングIOの場合、イベントCベースの非同期呼び出しがより適切かもしれません。詳細については、http://blog.gregweber.info/posts/2011-06-16-high-performance-rb-part3を参照してください。 – Wulfram

関連する問題