マルチスレッドを使いすぎているかどうかはどうすればわかりますか?


15

現在、マルチスレッドを使いすぎているように感じます。

A、B、Cの3種類のデータがあります。

それぞれAを複数に変換できB、それぞれBを複数に変換できますC

私はCsの治療にのみ興味があります。

これは、いくつかの変換関数を使用してかなり簡単に作成できます。しかし、スレッド、3つのキュー(queue_aqueue_bおよびqueue_c)で実装することに気づきました。異なる変換を実行する2つのスレッドと1つのワーカーがあります。

  • ConverterA読み取りqueue_aおよび書き込みqueue_b
  • ConverterB読み取りqueue_bおよび書き込みqueue_c
  • Worker 各要素を処理します queue_c

変換は平凡であり、このモデルが複雑すぎるかどうかはわかりません。しかし、私には非常に堅牢なようです。各「コンバーター」は、データがキューに到着する前でも動作を開始でき、コード内の任意の時点で新しいAsまたはBsを「送信」するだけで、ワーカーによってジョブをトリガーする変換パイプラインをトリガーします。糸。

結果のコードでさえ、よりシンプルに見えます。しかし、単純なスレッドを悪用しているかどうかはまだわかりません。


5
追いかけるために、この質問を少し短くする必要があると思います。タイトルは誤解を招くものでもあります-あなたが暴言を始めようとしているように聞こえます(あなたがそうではないとしても)。「マルチスレッドを過度に使用しているかどうかはどうすればわかりますか」に近い質問をする必要があります。
-KChaloux

@KChaloux同意します。私はそれを編集しましたが、それが私の考えをもう少し良く捉えることを願っています。
exhuma

4
@exhuma素晴らしい。あなたの-1は+1になります
KChaloux

3
@KChaloux ...トイレへの訪問があなたの思考プロセスに
もたらす違い

このオンラインPDFブック、Mature Optimization Handbook(ほんの数日前に発行されました)は、システム全体のパフォーマンスに対するモジュールの影響がモジュールの実行時間の一部を超えることがある体系的な効果について説明しています。
-rwong

回答:


16

ほとんどの場合、順番に考えてから、後でそのロジックを変更して、スレッドを使用してより適切に動作するようにします。そして、表現が進むにつれて、「それが壊れていなければ、修正しないでください。」ほとんどのプログラマは、スレッドを使用する必要がないという理由だけで、スレッドを使用しません。

あなたがそれらを使用してより快適に感じるなら、あなたへのより多くの力。ただし、スレッドがボトルネックを解消して速度を向上させない場合、プログラムの速度がほぼ確実に低下することに注意してください。

また、1つのCPUだけをプロセス専用にするシステムは、リソースを節約するために1つのスレッドで複数のスレッドをシミュレートすることを考慮してください(スマートフォンアプリケーションは依然としてこの悪用の対象となっていますが、これは現代のコンピューターではあまり起こりません)。この場合、スレッドを使用してボトルネックを解消していても、実際にはスレッドをまったく使用しなかった場合より遅くなります。

そして、おそらくスレッドを使用する際に注意を払う最も微妙な理由ですが、確かに重要なことではありませんが、スレッドは予期しないことをする傾向があります。はい、予防策を講じている場合は、大丈夫です。はい、スレッドがスレッド間で共有される変数に書き込まない場合は、大丈夫です。ただし、スレッド関連のバグを見つけるのは非常に困難です。プログラマーはコードにバグを作成する可能性を完全に排除することはできないという考えがあるため、プログラマーはバグを完全に排除することに集中するのではなく、可能性のあるバグから保護するための対策を講じる必要があります。スレッドのバグも見つけます。言い換えれば、あなたの最善の努力にもかかわらず、

とにかくスレッドを使用する必要がありますか?さて、スレッドの健全な知識は、特にあなたがそれに上手になれば、確かに悪いことではありません。ただし、最近の動きは、node.jsなどのシングルスレッド言語に向かっています。単一のスレッドを持つことの主な利点の1つは、スケーリングが容易であり、命令が順次実行されることが予想されることがわかっている場合、特定の最適化が行えることです(最適化とは、並列に実行できる命令が非同期で実行されます)。

そうは言っても、あなたにとって最も快適なことをしてください。私の経験では、あなたが理解しているプログラムを書くことは、より速く動作させるよりも優先されます。プログラムを書いているときにパフォーマンスあまり気にするべきではないので、プログラムを書くのに役立つと思うときはスレッドを使用してください。最適化は重要ですが、待つこともできます)。


興味深い点を挙げています。私の場合、変換パイプラインはパフォーマンスに関するものではありません。コードのシンプルさ/読みやすさについてです。ワーカースレッドパフォーマンスに関するものです。各最終タスクはリモートマシン上で実行され、複数のジョブをサブミットすると、タスクの実行が大幅に速くなります。
-exhuma

2
@exhuma複数のスレッドを介した並列実行に加えて、Futures / Promises、またはコールバック指向スタイルなどの非同期手法を使用することもできます。イテレータ/ストリームを連鎖させることでパイプラインをモデル化できることに注意してください。実際にスレッドを使用する必要はありません-あなたは、複数のCPUを利用したい場合を除いて(ネットワークコードでは、これはほとんどないケースではありません)
アモン

@exhumaはい、スレッドはパフォーマンス全般に役立ちます。私のポイントは、遅すぎるのでやらないのなら、プログラムを書くのに役立つのでやるべきだということです。最適化は常に後で行われます。プログラムからスレッドを削除すると最適化される場合もあります(ただし、ほとんどのプログラマーはそうではありません)。
ニール

OT:あなたのアバターが大好きです。私をにっこりさせる。
マルジャンヴェネマ

@ exhuma、私はこの答えに同意しますが、コードを簡素化するためにスレッドを使用する場合はそれで問題ありませんが、スレッドの安全性と複数のスレッドの潜在的な落とし穴を理解することに非常に注意してください 単純なマルチスレッドコードのように見えるものでも、追跡が困難なさまざまなバグにつながる可能性のある隠された競合状態を簡単に持つ可能性があります。
ベン・リー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.