0

一般的に、非同期的にリクエストを処理するリアクティブな非同期コード(play、akka、nettyなど)の周りには誇大宣伝があります。 このようにコードを実行している間は、可能な限り非同期ライブラリをブロックして使用しないことをお勧めします。 これを正しく理解すれば、リクエストごとにスレッドを作成するのではなく、それらのライブラリ(リクエストのメイン処理、サービス実行プログラム、非同期DBドライバ実行プログラムの非同期呼び出しなど)によって複数の実行部分がスレッドエグゼキュータで処理されます。 。)非同期DBライブラリはどのように実装されていますか?

このようにして実行が複数のスレッドに分割されます(複数のエグゼキュータで)。 これらの非同期ライブラリはどのようにメリットをもたらすように実装されていますか? async DBドライバには、単にDBの応答を待つスレッドを実行するエグゼキュータがあるシナリオでは、私はそれが何らかの利益をもたらすとは思いません。私たちは何かを待つことになり、ちょうど待っている余分なスレッドを作成するだけで何も助けにならないでしょう。それとも?

+1

これらのライブラリは、固定サイズのスレッドプールと非同期IOを使用します。彼らは各要求のために新しいスレッドを開かない.. –

+0

そして、あなたが知っている、これは本当に良い質問ではありません。あなたは様々なフレームワークをリストアップしています。そう何を探してるんですか?誰かがあなたにこれらのそれぞれが内部的にどのように働いているかを詳しく説明していますか? – GhostCat

答えて

1

私は、非同期ライブラリの一般的な誤解は、どのように動作するのかを想像する最も簡単な方法は、ライブラリが動作するように書かれた言語でそれらを実装する方法を考えることです「DoWorkAsyncが何か他のことが終了するのを待たなければならない場合、DoWorkAsyncは作業が完了するまで必ずスレッドを占有します」という考えにつながります。これは無駄なことに聞こえますが、唯一の利点は、非同期ライブラリが作業を待つために使用されるスレッドを管理することです。

しかし、これらの非同期メソッドは実際にJavaで直接アクセスするよりも低レベルの通信で機能します。

非同期作業では、データをすぐに取得できないIOの形式(IPC、ディスクアクセス、ネットワークアクセスなどあらゆる種類があります) OSは、非同期呼び出しを組み込み、低レベルでサポートしているデバイスドライバと通信して作業を開始できるようにし、ある種の割り込みを発生させて作業完了時にOSに通知します。この間、マネージド・スレッドは存在し続ける必要がなくなり(リソースの吸い上げを継続する)、デバイス・ドライバーは作業を処理している間にスレッドを待つ必要はありません。デバイスドライバが非同期作業が完了したことを示すと、OSはこの情報を渡し、スレッドを使用して作業を続行します。

上記は非常に簡単な説明であり、あらゆる点で不正確かもしれませんが、元の質問に答える非同期データを待つ必要はありません。

この優れた(そして簡潔な)記事の詳細はあります:There Is No Threadは(それは.NETについてですが、同じ原則が適用されます)

関連する問題