8

私は、どの解決策を取るべきかを決めることができないという問題の真っ只中にいます。

問題は少し独特です。このように言えば、私はネットワークから継続的にデータを受信して​​います(1秒間に2〜4回)。これで、各データは異なる、たとえばグループに属します。ここで、これらのグループをgroup1、group2などと呼びましょう。

各グループには専用のジョブキューがあり、ネットワークからのデータがフィルタリングされ、対応するグループに追加されて処理されます。

最初に、グループごとに専用のスレッドを作成しました。このスレッドは、ジョブキューからデータを取得し、それを処理してから、(リンクされたブロックキューを使用して)ブロック状態になります。

しかし、私の先輩は、スレッドプールを使用することを提案しました。これにより、スレッドがブロックされず、他のグループが処理に使用できるようになるためです。

しかし、ここに問題があります。取得するデータは十分に高速であり、スレッドが処理するのにかかる時間は、スレッドがブロッキングモードに移行しないのに十分な長さです。また、これにより、データが順番に処理されることが保証されます(ジョブ1はジョブ2の前に実行されます)。これは、プーリングではほとんど発生しない可能性があります。

私の先輩はまた、スレッドがプールされているので、プールによって多くのメモリが節約されるという事実に傾倒しています(彼は本当に言葉を求めていたと思います;))。私はこれに同意しませんが、個人的には、プールされているかどうかにかかわらず、各スレッドが独自のスタックメモリを取得していると思います。スレッドプールに私が気付いていないものがない限り。

最後に、プーリングは、短時間で大量のジョブが表示される場合に役立つと常に考えていました。スレッドの初期化にかかる時間はジョブの実行に費やされる時間よりもはるかに長いため、スレッドの生成はパフォーマンスの低下につながるため、これは理にかなっています。したがって、プーリングはここで大いに役立ちます。

しかし、私の場合、group1、group2、...、groupNは常に生きたままです。したがって、データがあるかどうかにかかわらず、それらはまだそこにあります。したがって、ここではスレッドの生成は問題ではありません。

私の先輩は確信が持てず、メモリフットプリントが大きいため、プーリングソリューションを使用することを望んでいます。

では、どの道をたどるべきでしょうか?

ありがとうございました。

4

2 に答える 2

4

スレッドを作成すると、スレッドごとのデフォルト スタック (IIR 512Kb、ただし構成可能) を含むリソースが消費されます。したがって、プーリングの利点は、限られたリソース ヒットが発生することです。もちろん、実行する作業に応じてプールのサイズを調整する必要があります。

特定の問題については、各シナリオでパフォーマンス/スレッド使用量などを実際に測定することが重要だと思います。制約に遭遇しない限り、アプリケーションに大きな影響を与えることなく、ある実装を別の実装に交換できることを確認する以外は、おそらくどちらの方法でも心配することはありません。時期尚早の最適化は諸悪の根源であることを忘れないでください。次の点に注意してください

「時期尚早の最適化」は、プログラマーがコードの設計に影響を与えるパフォーマンスの考慮事項を許可する状況を説明するために使用されるフレーズです。これにより、最適化によってコードが複雑になり、プログラマーが最適化に気を取られてしまうため、設計が本来あるべきほどきれいでなかったり、コードが正しくない可能性があります。

于 2012-07-28T11:57:49.227 に答える
4

良い質問。あなたが言ったように、プーリングは確かに初期化時間を節約します。ただし、リソース管理という別の側面があります。そして、ここで私はあなたにこれを尋ねています - あなたはいくつのグループ (読み取り専用スレッド) を持っていますか? アプリケーションの実行期間中に動的に成長しますか?

たとえば、この質問に対する答えがイエスである状況を考えてみましょう。新しいグループ タイプが動的に追加されます。この場合、作成されるグループの量に技術的に制限がないため、それぞれに専用のスレッドを割り当てたくない場合があります。多くのスレッドを作成すると、システムは実際の作業を行う代わりにコンテキストの切り替えを行います。 . レスキュースレッドプールへのスレッドプーリングにより、負荷に関係なく、作成できる可能性のあるスレッドの最大数に制限を指定できます。そのため、アプリケーションは特定のリクエストからのサービスを拒否する場合がありますが、通過したリクエストは適切に処理され、システム リソースを大幅に使い果たすことはありません。

上記を考慮すると、あなたの場合、各グループに専用のスレッドを用意しても問題ない可能性が非常に高いです!

メモリを節約するという先輩の信念も同じです..確かに、スレッドはヒープ上のメモリを占有しますが、それは本当にそんなに多く、事前に定義された量であれば、たとえば 5.10 であっても、おそらく問題ありません。いずれにせよ、あなたが優先事項であり、実際に問題があることを完全に確信していない限り、プーリングを使用すべきではありません!

プーリングは設計上の決定であり、アーキテクチャ上の決定ではありません。パフォーマンスの問題が発生した後にプーリングが有益であることがわかった場合に備えて、最初からプールせずに最適化を続行することはできません。

リクエストのシリアル化を (順番に実行するために) 考慮すると、スレッドプールを使用しているか専用スレッドを使用しているかは関係ありません。順次実行は、単一のハンドラ スレッドと結合されたキューのプロパティです。

于 2012-07-28T12:11:57.180 に答える