0

非同期キュー コンシューマー スレッドのアルゴリズムをまとめるのに問題があります。これは、長時間実行する (少なくとも数秒) 作業を行うためにディスパッチする必要がある単一のキューからアイテムを読み取るものです。

基本的に、キューは次のようになります: A、A、A、A、A、B、B、A、B、A、A、A、A、A、C、B、A。

すなわち。A メッセージは、他のメッセージよりもはるかに一般的です。

私たちのシステムでは、異なるメッセージ タイプごとに異なる同時実行値があります。たとえば、一度に実行できるのは 3 x A メッセージのみですが、5 x B および 4 x C メッセージを一度に実行できます。

私の現在の (壊れた) アルゴリズムは、実際のペイロードを実行する前に、各ジョブの本体が十分なリソースが利用可能になるのを待って、キューの先頭から読み取り、各ジョブをスレッドプールにディスパッチする単一のスレッドを持つことです。

これは、十分な量の A メッセージが最初に到着すると、スレッド プールのキューが「いっぱいになる」可能性があり、B+C メッセージは必要以上に長く枯渇することを意味します。

これまでのところ、メッセージの種類ごとに個別のスレッド プールを用意することを考えてきました (種類の数はかなり少ない) が、それだけ多くのスレッドを保持することの効率が心配です。

これを改善する方法について何か提案はありますか?

4

3 に答える 3

4

単一のディスパッチャーを用意して、メッセージのタイプに基づいた個別のキューにディスパッチしてみませんか。したがって、合計 4 つのディスパッチャーがあり、最初のディスパッチャーはメッセージを他の 3 つのキューに送信します。

次に、独自のルールに基づいてキューからメッセージを引き出す個別のキューリーダーがあります。

于 2009-06-16T14:48:50.940 に答える
0

まず、次の仮定は有効ですか?

  • ジョブが実際に実行される順序は関係ありません。
  • キューは、実行するジョブを記録するための単なるメカニズムです。
  • 仕事はすべて独立しています。
  • 常に複数のジョブが処理待ちです。

もしそうなら、これはジョブショップのスケジューリングの問題の例だと思います. これらは通常、ビン パッキング アルゴリズムを使用してモデル化されていると思います。上記のトピックを Google 検索すると、多くの参考文献が見つかるはずです。

制約が非常に単純であるため、ナップザック パッキング アルゴリズムがビン パッキングよりも適している可能性があります。ナップザックの問題をグーグルで検索してください。

于 2009-06-16T15:05:28.567 に答える
0

メッセージの種類ごとに個別のスレッドプールを用意することがそれほど悪いことかどうかはわかりません。それを実行して、何が起こるかを確認するだけです。

別の方法として、スレッドプールのラッパーを作成し、優先キューを実装することができます ( http://en.wikipedia.org/wiki/Priority_queue )。この暗黙性により、特定のメッセージに優先順位が割り当てられます。あなたの場合、C は最も一般的ではないため、常に C を優先することができます。私はあなたがポイントを得ると思います。

于 2009-06-16T14:50:15.540 に答える