マルチスレッドを使用して 30 の独立したタスクを同時に実行するアプリケーションがあります。各タスクは http 経由でデータを取得し、計算を実行して結果を UI スレッドに返します。
これは、IO バウンドの並行プログラムです。
TPL を使用して同じタスクを実行できますか?
できますが、TPL は CPU バウンドの並列プログラム用に設計されているため、悪用することになります。
TPL は 30 個の新しいスレッドを作成し、利用可能なすべてのコアに分散しますか? それとも、利用可能なコアにタスクを分割し、コアごとに 1 つのスレッドを使用するだけですか?
ない。TPL は基本的に、コアごとの待機なしのワークスティーリング タスク キューを使用して、実行時に CPU を集中的に使用する計算の負荷を動的に分散します。
この場合、マルチスレッドよりも TPL を使用するとパフォーマンスが向上しますか?
30 のスレッドの作成と、不要なスレッドが発生する余分な競合を節約できます。
問題の正しい解決策は、スレッドをブロックしない非同期プログラムを作成することです。これは、ダウンロードが完了した後にデータで呼び出される継続として、ダウンロードが完了した後の残りの計算を表現することによって行われます。
Microsoft の新しい F# プログラミング言語には、これを簡単にするために特別に設計された機能が含まれています。たとえば、F# では 5 行のコードだけで問題を解決できます。
let fetchCalcAndPost uris calc post =
for uri in uris do
async { use client = new System.Net.WebClient()
let! data = client.AsyncDownloadString uri
do calc data |> post }
|> Async.Start
このソリューションはスレッドをブロックしないため、完全に同時実行されます。