0

ディスラプター初心者です。次の2つのクエリがあります。

Q1. 1 つのプロデューサーから 1 つのコンシューマーへ、1 つのプロデューサーから複数の従属コンシューマーへのサンプル コードを取得しました。

複数のプロデューサーから複数のコンシューマーまたはシーケンサーのサンプル コード (3P – 1C) を取得したいと考えています。ブログやコード サンプルを参照してもらえますか?

Q2. これは、複数のプロデューサ環境で、1 つのプロデューサの結果がリング バッファ内の前のプロデューサの結果とどのように関連するかに関する一般的な質問です。

例: Is Disruptor は、単一のファイル/変数が複数のプロデューサーによって更新される環境で使用できます。つまり、2 つのプロデューサー (P1、P2) があり、1 つの共有変数 ("count" という名前) を更新しています (ここで、count は ValueEvent クラスのインスタンス変数です)。

最初の「count」値は 0 です。

プロデューサー P1 は、「カウント」の現在の値に 1 を追加します。したがって、プロデューサー P1 が処理された後、count の値は (0+1) = 1 になります。

プロデューサー P2 は現在の「カウント」値に 2 を加算します。したがって、プロデューサー P2 が処理した後、カウントの値は (1+2) = 3 になります。

基本的に、P2 は更新された「カウント」値 (P1 によって行われる) をリング バッファーから読み取り、インクリメントされた値を追加する必要があります (2)。

プロデューサーの実行順序を維持するにはどうすればよいでしょうか? (P2 は常に P1 の実行後に実行されます。)

コンシューマー側では、コンシューマー (C1,C2) は「カウント」値を順次 (1,3,.,.,.) として読み取ります。これは問題ありません。リング バッファーでは、各コンシューマーはリング バッファーの値を順番にのみ読み取ります。

ありがとう、プラセンジット。

4

2 に答える 2

0
  1. 複数のプロデューサーと単一のコンシューマーを説明するサンプル プロジェクトを作成しました。リンクは次のとおりです。 http://krishnansrinivasan.wordpress.com/2012/07/29/using-disruptor-net-with-wcf-2/

  2. プロデューサは、RingBuffer によって抽象化された変数の状態を更新することはありません。Ringbuffer は、プロデューサーからメッセージを受信した順序に基づいて、コンシューマーへの呼び出しを厳密に順序付けする場合にのみ役立ちます。

于 2012-07-31T18:05:02.897 に答える
0

q1: 例はありません。ただし、Java 実装を使用していると仮定すると、完全に独立した複数のプロデューサーが必要な場合は ProducerBarrier を使用する必要があります。

q2: しかし、あなたの Q2 は、あなたのディスラプターに独立したプロデューサーがいないことを教えてくれました。依存関係 P1、P2、{C1,C2} があるためです。P2 が別の変数 (P1 が更新する同じ変数ではない) を更新する「消費者」であり、C1&C2 が P2 に従うと考えてください。

例: P1 は count=0+1 を実行します。P2 は count2=1+2=3 を実行します。C1&C2 は「count2」変数を読み取ります。次に、P1->P2->{C1,C2} を持つようにディスラプターをセットアップします。P2 は、P1 が終了するまで処理を開始しません。C1 と C2 は、P2 が終了するまで処理を開始しません。

ピーク パフォーマンスの後である場合は、2 つのカウンター間のキャッシュ ラインの共有に注意する必要があります。

于 2012-05-23T12:47:40.960 に答える