1

タイムリーに処理する必要がある作業項目で常にキューがいっぱいになっているキューがあります。そのため、処理中の項目を受け取るためにさまざまなプロセッサが待機しています。

これらのサブプロセッサはそれぞれ、一度に 1 セットのデータしか処理できず、データをプッシュする必要があるため、これが私がそれを行うことを考えていた方法です

それは次のように始まります:

  1. プロセスはアイテムをキューに挿入します
  2. キューは一意である必要があります-アイテムが既にキューにある場合、再挿入されるべきではありません(現時点ではわかりません-しかし、そのようなアイテムの優先度を上げる必要があるかもしれません。その場合、キューはそうではありません仕事)

私が考えていた

  1. Dispatcher は、使用可能なプロセッサごとにオブジェクトを作成します
  2. ループを開始:
  3. Dispatcher 処理するアイテムがキューにあるかどうかを確認します
  4. Dispatcher は、現在動作していないプロセッサを探します
  5. Dispatcher 作業項目を Idle Processor に送信します
  6. 開始ループに移動:

私の質問は、次のいずれかを実行することを考えているプロセッサ オブジェクトのスレッドをどのように管理するかです。

  1. Processor オブジェクトがディスパッチャーによってくすぐられた場合 - スレッドを作成し、そのスレッドで処理を開始します。スレッドが終了すると、終了します。- 明らかな短所: 大量のスレッドを作成して強制終了する (スレッド プールはこの問題を軽減しますか?)
  2. 作業を行うプロセッサごとに専用スレッドを作成し、プロセッサ オブジェクトをチェックして、それ以上の作業があるかどうかを確認します - 明らかな短所: 50 プロセッサは 50 スレッドを意味し、同期が困難になる可能性があります
  3. おそらくこれを行うより簡単な方法があります

ありがとう 編集

私は不明確だったようです-データはすべてのプロセッサで処理される必要はありません。どのプロセッサでも処理できます-ただし、プロセッサがデータの処理を開始すると、処理が完了するまで新しいデータを送信できません-その間、新しいデータがキューに流れ込んでおり、マネージャーはできるだけ早くデータを出し続ける必要があります -

というわけでループはまたこんな感じ

  1. Dispatcher は、プロセッサのいずれかが使用可能であり、処理するアイテムがキューにあるかどうかを確認します
  2. Dispatcher は、アイドル状態のプロセッサを選択し、キューから先頭のデータを取り出し、そのプロセッサに送信して処理します
  3. ディスパッチャーは少し待ってから再びプールします

プロセッサ側 - データは外部システムに送信され(やや長いプロセス)、プロセッサは外部システムが戻るのを待ち、処理されたデータを保存します - その後、新しいデータセットを除いてプロセッサを使用できますオフキューの

4

1 に答える 1

1

同様のキュー管理システムを実現する最も簡単な方法は、C# で組み込みの Queue オブジェクトを使用することです。

public volatile Queue<MessageObject> q = new Queue<MessageObject>();

ここで、メッセージを各スレッドに送信する必要があります。同期を実際に処理したくない場合は、最上位のオブジェクトをロックしてポップします。スレッドをスプールするか、EventHandler を使用できます。EventHandler を使用する場合は、両方のスレッドで同期する必要がありますが、より高速になるはずです。

lock(q) { 
    this.nextcommand = q.Pop();
}
于 2012-08-13T18:37:28.513 に答える