2009-08-28 9 views
0

Rubyでは、通信スレッド、レンダスレッド、多分キャッシングスレッドの2つ(または多分3つ)のプログラムの「ファセット」を連続して実行する必要があります。スレッドまたはDRb?

レンダリングスレッドはスライドショー(その定義はファイルから読み込まれます)を表示し、すべてのスライドは通信スレッドによってリモートHTTPサーバーから取得されます。レンダリングは連続していなくてはいけません(したがって、キャッシングの可能性が高い)。ファイルはプログラムの存続期間中に変更される可能性があるため、(その場で)再解析する必要があります。

私はcommsスレッドがショー全体を取得したときのように "ファセット"間でメッセージを送信したいと思います。例えば、ショー全体がダウンロードされるのを待つ前にレンダリングスレッドを開始することができます。に。

RubyスレッドまたはDRbを使用する必要がありますか?どのようにスレッド間でメッセージを渡すことができますか?

フィードバックありがとうございます。

答えて

2

まずは、まずはまずはアドバイスをしてください。まず2つのスレッドから始め、パフォーマンスが必要なものかどうかを確認します。条件変数または単純なMutexを使用して、取得したチャプターのリストを同期させることができます。おそらく、アンダーランの問題が生じるでしょう - レンダリングに利用可能な章はありませんが、Rubyのコアを使うだけで、実用的な解決策の骨を持っています。

次に、他の可能性を提供する解決策を見てください。 DRbとは別に、EventMachine(チャプターを読むときに必要な非同期機能)と、メッセージングシステムが提供するより一般的で疎いカップリングのためのRabbitMQも見てください。

小さなものから始まり、あまりにも速く動こうとしないでください。 Rubyスレッドに懸念がある人は、RabbitMQキューでリッスンする小さなレポートレンダリングクライアントを実行しています。クライアントは、(google)グラフをレンダリングするために4つのスレッドを使用し、アラートを送信し、さまざまなキューを自動的にリセットします(数時間のデータが収集された後)。すべての作品は素晴らしい!

クリス

+0

私だけのための機能を渡すメッセージのDRBの検討している - 私は...右のスレッドでそれを持つことができませんか?私はmutexでハックすることができますが、それはまだハックです...そうですか? :) DRbはとても簡単です。 –

+0

複数のプロセスが必要な場合は、実際にはメッセージパッシングシステムしか必要ありません。それはあなたが複数のプロセスが必要なので私はそれを簡単に保つことをお勧めしたいと思います。私はあなた自身に似たようなことをしています(リモートデータを集めて処理し、出力をレンダリングします)。単純なスレッドシステムがうまくいくでしょう。私は各ステージとスレッドを1スレッドずつ持っています。しかし、あなたが必要と考えるものを使用してください! 幸い! –

+0

IMHO、RabbitMQの提案は正しい方法です。以前はDRbとRabbitMQの両方でこの種のことをやっていましたが、DRbのソリューションは理想的ではありませんでした。 RabbitMQは数十倍も高速で、celldeeのBunnyライブラリを使用している場合は、はるかに簡単です。 –