8

アプリケーションをマルチスレッド化するにはどうすればよいですか? 非同期関数を使用しますか? または、新しいスレッドを生成しますか? 非同期関数はすでにスレッドを生成していると思うので、ジョブがファイルの読み取りだけを行っている場合、怠惰でスレッド上でジョブを生成するだけではリソースが「無駄」になります...スレッドを使用するときに何らかの設計がありますか?または非同期関数?

4

5 に答える 5

7

.Netについて話している場合は、 ThreadPoolを忘れないでください。スレッドプールは、非同期関数がよく使用するものでもあります。多くのスレッドにスポーンすると、実際にパフォーマンスが低下する可能性があります。スレッドプールは、作業を最速で実行するのに十分なスレッドを生成するように設計されています。したがって、スレッドプールがニーズを満たさない場合を除いて、独自のスレッドを生成する代わりにスレッドプールを使用してください。

PS:そしてMicrosoftのParallelExtensionsに注目してください

于 2008-09-14T14:02:59.153 に答える
6

スレッドの生成は、大量のスレッドの生成を開始した場合にのみリソースを浪費します。1つまたは2つの余分なスレッドはプラットフォームのパフォーマンスに影響しません。実際、Systemには現在70を超えるスレッドがあり、msnは32を使用しています(実際にはメッセンジャーがその数のスレッドをどのように使用できるか、特に最小化されていて実際には何もしていない場合はわかりません...)

通常、スレッドを生成するのに適したタイミングは、何かに時間がかかる場合ですが、他のことを続ける必要があります。

たとえば、計算に30秒かかるとします。最善の方法は、計算用の新しいスレッドを生成することです。これにより、画面の更新を続行し、計算が完了するまでアプリがフリーズするとユーザーが嫌うため、ユーザー入力を処理できます。

一方、ほぼ瞬時に実行できることを実行するためのスレッドを作成することは、作成のオーバーヘッド(またはスレッドプールを使用して既存のスレッドに作業を渡すことさえ)が単にジョブを実行するよりも高くなるため、ほとんど無意味です。最初の場所。

場合によっては、アプリを独自のスレッドで実行されるいくつかの個別の部分に分割できます。たとえば、ゲームでは、アップデート/物理学などが1つのスレッドであり、グラフィックが別のスレッドであり、サウンド/音楽が3番目であり、ネットワーキングが別のスレッドである場合があります。ここでの問題は、これらの部分がどのように相互作用するかを実際に考えなければならないことです。そうしないと、パフォーマンスが低下したり、バグが「ランダムに」発生したり、デッドロックが発生したりする可能性があります。

于 2008-09-14T14:06:39.223 に答える
2

2番目のFireLancerの答え-独自のスレッドを作成することは、大きなタスクを処理したり、同期アプリの残りの部分を「ブロック」するタスクを処理したりするための優れた方法です、問題を明確に理解する必要がありますスレッドのタスクを明確に定義し、スレッドが実行する範囲を制限する方法で解決および開発する必要があること。

私が最近取り組んだ例として、Javaコンソールアプリが定期的に実行され、基本的にURLをスクリーンスクレイピングし、DOMでドキュメントを解析し、データを抽出してデータベースに保存することでデータをキャプチャします。

シングルスレッドアプリケーションとしては、ご想像のとおり、50kbのページで平均して1秒あたり約1urlの時間がかかりました。それほど悪くはありませんが、何千ものURLをバッチで処理する必要があるようにスケールアウトする場合、それは良くありません。

アプリのプロファイリングでは、ほとんどの場合、アクティブなスレッドがアイドル状態(I / O操作を待機していた)であることが示されました。リモートURLへのソケットを開く、データベースへの接続を開くなどです。このような状況は簡単に発生する可能性があります。マルチスレッドで改善されました。マルチスレッドに書き直し、シングルコアCPUでも、1つではなく5つのスレッドを使用すると、スループットが20倍以上向上しました。

この例では、各「ワーカー」スレッドは明示的に実行内容に制限されていました。リモートのリモートURLを開き、データを解析して、データベースに保存します。すべての「高レベル」処理-解析するURLのリストを生成し、次にエラーを処理するURLのリストを作成し、すべてメインスレッドの制御下にとどまりました。

于 2008-09-14T14:55:09.123 に答える
0

答えは「状況次第」です。

それはあなたが達成しようとしていることに依存します。あなたがより多くのパフォーマンスを目指していると仮定します。

最も簡単な解決策は、パフォーマンスを向上させる別の方法を見つけることです。プロファイラーを実行します。ホットスポットを探します。不要なIOを減らします。

次の解決策は、プログラムを複数のプロセスに分割し、各プロセスを独自のアドレス空間で実行できるようにすることです。個々のプロセスが互いに混乱する可能性がないため、これが最も簡単です。

次の解決策は、スレッドを使用することです。この時点で、ワームの主要な缶を開いているので、小さく始めて、コードのクリティカルパスのみをマルチスレッド化します。

次の解決策は、非同期IOを使用することです。一般に、非常に負荷の高いサーバーを作成する場合にのみ推奨されます。それでも、C ++フレームワークICEやJavaでのEJBサーバーなど、詳細を抽象化する既存のフレームワークの1つを再利用したいと思います。

これらの各ソリューションには複数のサブソリューションがあることに注意してください。さまざまな種類のスレッドとさまざまな種類の非同期IOがあり、それぞれパフォーマンス特性がわずかに異なりますが、一般的には、フレームワークに処理させるのが最善です。

于 2008-09-16T12:04:22.993 に答える
0

スレッドを使用すると、アプリケーションでスレッドが必要になる方法についてより深く考えることができ、長期的にはパフォーマンスの向上/制御が容易になります。
非同期メソッドはより高速に使用できますが、少し魔法がかかっています-それを可能にするために多くのことが起こります-ある時点で、それらが提供できない何かが必要になる可能性があります。次に、カスタムスレッドコードを試してロールすることができます。
それはすべてあなたのニーズに依存します。

于 2008-09-14T14:05:05.793 に答える