送信するメッセージを含む複数のBlockingQueuesがあります。キューよりも消費者を少なくすることは可能ですか?私はキューをループしてポーリングを続ける(ビジー待ち)ので、キューごとにスレッドを必要としません。代わりに、私は、メッセージがいずれかのキューで利用可能なときに目覚めたスレッドを1つ持っていたいと思います。複数のブロックキュー、単一のコンシューマ
12
A
答えて
6
あなたができるトリックの1つは、キューのキューを持つことです。つまり、すべてのスレッドがサブスクライブする単一のブロッキングキューを用意することです。次に、BlockingQueuesのいずれかに何かをエンキューすると、この単一のキューにブロックキューもエンキューされます。
BlockingQueue<WorkItem> producers[] = new BlockingQueue<WorkItem>[NUM_PRODUCERS];
BlockingQueue<BlockingQueue<WorkItem>> producerProducer = new BlockingQueue<BlockingQueue<WorkItem>>();
新しい作業項目を取得する場合次に:
void addWorkItem(int queueIndex, WorkItem workItem) {
assert queueIndex >= 0 && queueIndex < NUM_PRODUCERS : "Pick a valid number";
//Note: You may want to make the two operations a single atomic operation
producers[queueIndex].add(workItem);
producerProducer.add(producers[queueIndex]);
}
を今すぐあなたの消費者がproducerProducer上のすべてのブロックをできるように、のようなものを持っているでしょう。私はこの戦略がどれほど価値があるかはわかりませんが、あなたが望むものを達成しています。
4
LinkedBlockingMultiQueueあなたが求めていることはありますか?コンシューマは任意のBlockingQueuesをブロックすることはできませんが、単一の「マルチキュー」から「サブキュー」を作成して同じ効果を得ることは可能です。プロデューサはサブキューで提供され、コンシューマは単一のマルチキューをポーリングして要素を待つことをブロックできます。
また、他の要素を考慮する前に、いくつかのキューから要素を取り出すことも、優先順位をサポートしています。
例:
LinkedBlockingMultiQueue<Int, String> q = new LinkedBlockingMultiQueue<>();
q.addSubQueue(1 /* key */, 10 /* priority */);
q.addSubQueue(2 /* key */, 10 /* priority */);
LinkedBlockingMultiQueue<Int, String>.SubQueue sq1 = q.getSubQueue(1);
LinkedBlockingMultiQueue<Int, String>.SubQueue sq2 = q.getSubQueue(2);
次に、あなたが提供できると投票:
sq1.offer("x1");
q.poll(); // "x1"
sq2.offer("x2");
q.poll(); // "x2"
は免責事項:私は、ライブラリの作者です。
関連する問題
- 1. SAML単一のSP複数のコンシューマ/ドメイン
- 2. 単一のプロデューサから複数のコンシューマ(同じコンシューマグループ)
- 3. 複数のプロデューサの単一コンシューマのロックフリーキューがC++に存在しますか?
- 4. Delphiのロックフリーキュー「複数のプロデューサ - 単一のコンシューマ」が存在しますか?
- 5. BlockingCollection複数のコンシューマ
- 6. コンシューマのみをブロックする単一のプロデューサ/コンシューマ循環バッファ
- 7. 単一のプロデューサ複数のコンシューマ - キューにはNULLが含まれています
- 8. Hornetq Core Bridge - 複数のコンシューマ
- 9. RabbitMQ、ドッカー、シングルキュー、複数のコンシューマ
- 10. 複数の単一フィールドインデックス対複数フィールドインデックス
- 11. 複数のエントリ単一セル
- 12. MongoDB複数の単一インデックス
- 13. 複数のジャー、単一パーシスタンスユニットソリューション?
- 14. wordpress複数の単一ページ
- 15. 単一のパーティションを持つトピックの同じgroup.idを持つ複数のコンシューマの予想される動作
- 16. Spring Kafkaパーティション用の複数のコンシューマ
- 17. 複数のコンシューマとC#BlockingCollectionのクエリ
- 18. 同じキューのRabbitMQ複数のコンシューマ
- 19. Rabbitmq 1つのキューを複数のコンシューマ
- 20. RabbitMQを使用して単一のキューで複数のコンシューマとの並行性を管理する方法は?
- 21. 複数のプロデューサと複数のコンシューマのためのRedis pubサブ
- 22. Node.js:単一変数、複数の約束
- 23. 独立したコンシューマでの単一のInputStreamの同時処理
- 24. MongoDBインデックス:複数の単一フィールド対単一の化合物?
- 25. セマフォを持つ複数のプロデューサ/コンシューマ
- 26. Golang Rabbit MQファンアウトExchange複数のコンシューマ
- 27. 単一のリスト内の複数のクラスタイプ
- 28. 単一のチェックボックスグループの複数の「ラベル」
- 29. 単一のタブの複数のビュー
- 30. 単一のJVM内の複数のスパークサーバ
これと複数のプロデューサに与えられる単一のブロッキングキューとの違いは何ですか? –
Alexが達成したいことは、複数のブロッキングキューの上にブロッキングキュー(ラッパー)を作成し、コンシューマが単一のブロッキングキューを待つことができるようにすることだと思います。おそらくこの状況は、Alexが同じブロッキング・キュー・インスタンスを使用するようにプロデューサに要求することを防ぎます。 – sjlee
問題は、キューごとに複数のコンシューマを必要としないことです。 1つのキューにすべてをダンプすると、消費者は同じキューから食べることができます。 したがって、私はAのキューとBのキューを持っています。他のBがまだ取られている限り、Bは取られない。 – Alex