2017-05-20 8 views
-1

私たちは、約200項目の復号化ロジックを持つWebAPIを開発しています。各復号には約20msかかる。 私たちはタスクをできるだけ早く完了させるためにタスクを並列化しようとしましたが、古いスレッドが完了するのを待ってスレッドが再利用されるため、ある種の制限があるようですほんの少ししか使用されていません) - 全体のアクションは完了するのに約1〜2秒かかります。スレッド(タスク)WebAPIの制限(または一般的に)

私たちが基本的に達成したいのは、スレッドのx量を同時に開始し、〜20ms後に終了することです。

我々はこの試みた: Await multiple async Task while setting max running task at a time

をしかし、我々がそれを解放したい一方で、これが唯一の制限を設定することについて説明しそうです...

ここに抜粋です:

    var tasks = new List<Task>(); 
        foreach (var element in Elements) 
        { 
         var task = new Task(() => 
         { 
          element.Value = Cipher.Decrypt((string)element.Value); 
         } 
         }); 
         task.Start(); 
         tasks.Add(task); 
        } 
        Task.WaitAll(tasks.ToArray()); 

我々は何ですかここに行方不明?

ありがとう、 Nir。

+2

あなたはタスクscheduellerを書いているのでなければ 'new task(' 'Task.Run'を使うべきです。 –

答えて

1

に最適なようにスケジュール平行になる私は、ASPで並列処理をお勧めすることはできません。ネット。特に公共の場面では、サービスのスケーラビリティに大きな影響を与えます。私は「ああ、私はこれを行うには十分スマートだ」と思っていましたが、ASP.NETアプリケーションでは数回並列処理を追加しました。あなたはが本当にに...

をしたい場合は

しかし、あなたのマシン上の物理コアの限界です、我々は限界

のいくつかの種類を取得しているようですか?

我々はこれを試みた:溶液非同期同時コード(例えば、I/Oバウンド)のために特別にある時間

で最大実行中のタスクを設定してタスク非同期複数待ちます。あなたが望むのは、並列(スレッド化された)並行コード(例えば、CPUバインド)です。完全に異なるユースケースとソリューション

ここでは何が欠けていますか?

あなたの現在のコードはスレッドプールで同時に大量のタスクをスローしています。スレッドプールでは、可能な限り最善の処理を試みます。より高いレベルの抽象化を使用すると、これをより効率的にすることができます。、Parallel

Parallel.ForEach(Elements, element => 
{ 
    element.Value = Cipher.Decrypt((string)element.Value); 
}); 

Parallel(すなわち、コア数を超えない)、その区分とスレッドの(再)使用の点で、よりインテリジェントです。だからあなたはいくつかのスピードアップを見なければなりません。

しかし、私はそれがほんのわずかなスピードアップであると予想します。物理コアの数によって制限されている可能性があります。

0

一切ハイパースレッディングAsumingません:それは1つのコア20msのを取るかのようにあなたがそれを見ることができ、1つの項目に対して20msのを取る場合

を。 200アイテムが20ミリ秒で完了するようにするには、200コアが必要です。あなたは多くの人が、それだけで通常のsurcumstances下で...

を行うことができないことを持っていない場合は、できるだけ多くのタスクは、あなたのシステム

関連する問題