7

よし、文章にしてみよう…

asyncメソッドを作成し、それをキーワードで呼び出す例を考えてみましょう。await私の知識によると、

  1. メインスレッドが解放されます
  2. 別のスレッドで、非同期メソッドの実行が開始されます
  3. 実行されると、ポインターはメインスレッドに残された最後の位置から再開されます。

質問 1:メイン スレッドに戻るか、それとも新しいスレッドになりますか?

質問 2:非同期メソッドが CPU バウンドまたはネットワーク バウンドの場合、違いはありますか? はいの場合、何ですか?

重要な質問

質問 3 :それが CPU バウンドのメソッドであると仮定すると、何を達成できましたか? つまり、メインスレッドは解放されましたが、同時にスレッドプールから別のスレッドが使用されました。ポイントは何ですか ?

4

3 に答える 3

4
  1. 呼び出し元とasyncメソッドの実行は、すべて現在のスレッドで行われます。asyncメソッドは新しいスレッドを作成async/awaitせず、 using は実際に追加のスレッドを作成しません。代わりに、スレッドの完了/コールバックは、同期コンテキストと制御の中断/付与で使用されます (Node.js スタイルのプログラミングを考えてみてください)。awaitただし、ステートメントに制御が発行されたり、制御が返されたりすると、別の完了スレッドになる可能性があります (これは、アプリケーションやその他の要因によって異なります)。

  2. はい、CPU またはネットワークにバインドされている場合は、実行が遅くなります。したがって、await時間がかかります。

  3. 利点は、信じられないかもしれませんが、スレッドに関するものではありません...非同期プログラミングは、必ずしも複数のスレッドを意味するわけではありません。async利点は、結果を待つ前に、結果を必要としない他の作業を続行できることasyncです... 例としては、Web サーバーの HTTP リスナー スレッド プールがあります。サイズが 20 のプールがある場合、制限は 20 の同時リクエストです...これらのリクエストのすべてがデータベース作業の待機に時間の 90% を費やしている場合async/await、データベースは機能し、その間にawaitデータベース結果のコールバックが行われます。解放されます...スレッドはHTTPリスナースレッドプールに戻り、元のユーザーがDB作業が完了するのを待っている間、別のユーザーがサイトにアクセスできるようになり、合計制限が引き上げられます.

それは実際には、外部にバインドされた低速な操作を待機しているスレッドを解放して、それらの操作の実行中に他のことを行うことです...組み込みのスレッドプールを利用します。

于 2013-09-26T16:12:24.863 に答える