非同期呼び出しは常に新しいスレッドを作成しますか?2つの違いは何ですか?
非同期呼び出しは常に新しいスレッドを作成または使用しますか?
コンピュータプログラミングでは、非同期イベントはメインプログラムフローとは無関係に発生するイベントです。非同期アクションは、非ブロックスキームで実行されるアクションであり、メインプログラムフローが処理を続行できるようにします。
シングルスレッドで非同期呼び出しを実行できることを知っていますか?これはどのようにして可能ですか?
非同期呼び出しは常に新しいスレッドを作成しますか?2つの違いは何ですか?
非同期呼び出しは常に新しいスレッドを作成または使用しますか?
コンピュータプログラミングでは、非同期イベントはメインプログラムフローとは無関係に発生するイベントです。非同期アクションは、非ブロックスキームで実行されるアクションであり、メインプログラムフローが処理を続行できるようにします。
シングルスレッドで非同期呼び出しを実行できることを知っていますか?これはどのようにして可能ですか?
回答:
この質問は答えるのが一般的すぎます。
一般的なケースでは、非同期呼び出しは必ずしも新しいスレッドを作成しません。これは、既存のスレッドプールまたは外部プロセスが他の方法で実装する1つの方法です。言語、オブジェクトモデル(存在する場合)、およびランタイム環境に大きく依存します。
非同期とは、呼び出し側のスレッドが待機して応答を待機せず、呼び出し側のスレッドで非同期アクティビティが発生しないことを意味します。
それを超えて、より具体的に取得する必要があります。
非同期で発生する必要がある操作でCPUが動作する必要がない場合は、別のスレッドを生成せずにその操作を実行できます。たとえば、非同期操作がI / Oの場合、CPUはI / Oが完了するのを待つ必要はありません。操作を開始するだけで、I / Oハードウェア(ディスクコントローラー、ネットワークインターフェイスなど)がI / O作業を行っている間に他の作業に移ることができます。ハードウェアは、CPUに割り込みをかけることで、CPUに完了を知らせ、OSはアプリケーションにイベントを配信します。
多くの場合、より高いレベルの抽象化とAPIは、OSと基盤ハードウェアから利用可能な基盤となる非同期APIを公開しません。これらの場合、通常、生成されたスレッドがI / O操作を待機しているだけでも、非同期操作を実行するスレッドを作成する方が簡単です。
非同期操作でCPUが機能する必要がある場合、通常、その操作を別のスレッドで実行して、本当に非同期にする必要があります。それでも、実行ユニットが複数ある場合のみ、非同期になります。
いいえ、非同期呼び出しは常にスレッドを伴うわけではありません。
それらは通常、呼び出し元と並行して継続するある種の操作を開始します。ただし、その操作は、別のプロセス、OS、他のハードウェア(ディスクコントローラーなど)、ネットワーク上の他のコンピューター、または人間によって処理される場合があります。スレッドは、物事を並行して行う唯一の方法ではありません。
JavaScriptはシングルスレッドで非同期です。たとえば、XmlHttpRequestを使用する場合、応答が返されたときに非同期で実行されるコールバック関数を提供します。
John Resigは、JavaScriptでタイマーがどのように機能するかという関連する問題を適切に説明しています。
マルチスレッドとは、同じプロセスで発生する複数の操作を指します。非同期プログラミングはプロセス全体に広がります。たとえば、私の操作がWebサービスを呼び出す場合、スレッドはWebサービスが戻るまで待機する必要はありません。ここでは、スレッドが別のマシンのプロセスが完了するのを待たないようにする非同期プログラミングを使用しています。また、Webサービスからの応答の取得を開始すると、メインスレッドを中断して、Webサービスが要求の処理を完了したことを通知できます。これで、メインスレッドが結果を処理できます。
実際のスレッドをサポートする前に、メッセージループを使用する非プリエンプティブタイム(バージョン2.13、3.0、3.1など)以降、Windowsには常に非同期処理がありました。したがって、あなたの質問に答えるために、いいえ、非同期処理を実行するためのスレッドを作成する必要はありません。
非同期呼び出しは、呼び出しを呼び出すものと同じシステム/デバイスで発生する必要さえありません。そのため、非同期呼び出しで現在のプロセスにスレッドが必要かどうかという質問の場合、答えは「いいえ」です。ただし、非同期要求を処理する場所に実行スレッドが必要です。
実行のスレッドはあいまいな用語です。初期のMacintoshやWindows OSなどの協調型タスクシステムでは、実行のスレッドは、リクエストが別のスタックや命令ポインタなどを実行するのと同じプロセスである可能性があります。 、それらは通常、プロセス内(つまり、同じプロセス内)の場合は別のスレッドによって処理され、プロセス間であれば別のプロセスによって処理される呼び出しを意味します。
プロセス間(またはプロセス間)通信(IPC)は一般に、プロセス内通信を含むように一般化されていることに注意してください。
一部のシステムでは、コールバックを使用して、いくつかの機能でカーネルの同時実行性を利用できます。かなりあいまいなインスタンスでは、非同期IOコールバックを使用して、Macシステム6〜8の非優先マルチタスク時代にノンブロッキングインターネットサーバーを実装しました。
あなたは同時実行を持っているこの方法では、スレッドせずに、あなたのプログラム「の中の」ストリームなど。
非同期呼び出しの性質上、呼び出しの進行中もアプリケーションを実行し続けたい場合は、新しいスレッドを生成するか、少なくとも、目的のためだけに作成した別のスレッドを利用する必要があります。非同期コールバックの処理。
場合によっては、状況に応じて、非同期メソッドを呼び出して、それがユーザーに同期しているように見せたいことがあります(つまり、非同期メソッドが完了したことを通知するまでブロックします)。これは、WaitForSingleObjectなどのWin32 APIを介して実現できます。