0

オブジェクトを生成して共有キューに入れるプロデューサー スレッドがあります。

このキューから読み取ることができる一連のコンシューマー スレッドを生成しました。

理想的な状況では、すべてのワーカーがキューから次のジョブを取得します。しかし、一部のオブジェクト (特定の属性を持つ) については、コンシューマ スレッドのすべてにオブジェクトのコピーが必要です (重複なし)。

私の最初の衝動は、キューにプッシュするたびにオブジェクトのその属性をチェックすることでした。属性が存在する場合、n 個のコピーを作成し (ここで n は、私が持っているワーカーの数に等しい)、それらの n 個のコピーをキューにプッシュします。

キューは、同じワーカーがオブジェクトを複数回取得するのを防ぐために、いくつかの簿記を行う必要があります。

この簿記を行う 1 つの方法は、キーがオブジェクトで、値が一連のワーカー ID (スレッド ID の場合もあります) である Map を持つことです。

すべての pop 要求に対して、キューはオブジェクトが現在のスレッド ID によって既に処理されているかどうかを確認します。スレッド ID がマップに存在する場合、キューからオブジェクトをポップせずにクリティカル セクションを終了します。それ以外の場合は、オブジェクトをポップしてマップを更新します。

このアプローチの問題は、1 つのスレッドが他のスレッドのキューへのアクセスを枯渇させる可能性が非常に高いことです。

誰かがこの問題を解決するエレガントな方法を提案できますか?

ありがとう

4

1 に答える 1

2

私のおすすめ:

  • コンシューマーごとに 1 つのキューを持ち、
  • すべてのコンシューマーによって処理される新しいアイテムをすべてのキューにプッシュします。
  • 他のアイテムをオブジェクトの数に基づいて最短のキューにプッシュします(セマフォを上下にカウントします...)

凝ったやり方をしたい場合は、オブジェクトの累積サイズや特定の消費者のカスタムのサービス品質など、他のメトリックによって最短のキューを決定できます。

于 2012-07-31T21:50:11.503 に答える