2016-08-30 7 views
-2

並列非同期の複数のコアを使用することは可能ですが、どれも動作していないことを示す多くのコードを検索しました。それは常に単一のコアに固執しています。asyncとawaitで実行される並列タスク - 複数のコアを使用できない

可能ですか?

複数のコアで実行されているタスクを実行するための推奨設定を使用するコードですが、発生していません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Task.Run(async() => 
     { 
      var tasks = Enumerable.Range(0, 1000000) 
      .Select(i => Console.Out.WriteLineAsync((100000 * 10000).ToString())); 

      await Task.WhenAll(tasks); 
     }).GetAwaiter().GetResult(); 
    } 
} 

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

+0

なぜ壊れることがわかりますdebbugerで実行しているのですか?なにが問題ですか? –

答えて

3

Console.Outによってアクセスされているストリームは、技術的には非同期操作を公開しますが、実際に非同期には実行されません。すべての非同期メソッドは実際にはすべての作業を同期して行います。コンソールへの書き込みは非常に速いため、他の操作を行うのに時間がかかります。

もちろん、その操作を実際に非同期実装(ネットワークIOなど)を行ったIO操作に置き換えたとしても、IOバインドされているため、CPU使用率はそれほど高くありません。 CPUはIO操作を開始する以上の何もする必要はありません。実際にたくさんのCPUコアが多くの作業をしているのを見たい場合、作業は主にCPU境界作業である必要があります。 1 -

+0

コンソール自体には多くの競合があることは言うまでもありません。数百万のタスクを並行して作成することは、すべての個々の操作のオーバーヘッドを考えれば、並列性を全く悪用することはほとんどありません。ここで唯一興味深いのは、 'ToString'です。これは、並列化されていないため、I/O操作を生成する際にボトルネックになります。 – Luaan

+0

まだ、皆さんは正しくありません: –

+0

@FernandoSilvaあなたは何が間違っていると思いますか、なぜそれは正しくないと思いますか? – Servy

0

@Servyは右、ちょうどこのコード

 Task.Run(async() => 
     { 
      var tasks = Enumerable.Range(0, 1000000) 
      .Select(i => Console.Out.WriteLineAsync((100000 * 10000).ToString())); 
      Debugger.Break(); 
      await Task.WhenAll(tasks); 

     }).GetAwaiter().GetResult(); 

あなたは一度だけ

関連する問題