質問

非同期呼び出しは常に新しいスレッドを作成しますか? 2つの違いは何ですか?

非同期呼び出しは常に新しいスレッドを作成または使用しますか?

Wikipediaのコメント

  

コンピュータープログラミングでは、非同期イベントはメインプログラムフローとは独立して発生するイベントです。非同期アクションは、ノンブロッキングスキームで実行されるアクションであり、メインプログラムフローが処理を続行できるようにします。

非同期呼び出しはシングルスレッドで実行できることを知っていますか?これはどのように可能ですか?

役に立ちましたか?

解決

この質問は一般的すぎて答えられません。

一般的な場合、非同期呼び出しは必ずしも新しいスレッドを作成するわけではありません。これは、既存のスレッドプールまたは外部プロセスを別の方法で実装する1つの方法です。言語、オブジェクトモデル(存在する場合)、および実行時環境に大きく依存します。

非同期とは、呼び出し側のスレッドが応答を待機せず、呼び出し側のスレッドで非同期アクティビティが発生しないことを意味します。

さらに、より具体的にする必要があります。

他のヒント

非同期で発生する必要がある操作がCPUの動作を必要としない場合は、別のスレッドを生成せずにその操作を実行できます。たとえば、非同期操作がI / Oの場合、CPUはI / Oが完了するのを待つ必要はありません。操作を開始するだけで、I / Oハードウェア(ディスクコントローラー、ネットワークインターフェイスなど)がI / O作業を行っている間に他の作業に進むことができます。ハードウェアはCPUに割り込むことでCPUが終了したことをCPUに知らせ、OSはアプリケーションにイベントを配信します。

高レベルの抽象化およびAPIは、OSおよび基盤となるハードウェアから利用可能な基盤となる非同期APIを公開しません。これらの場合、生成されたスレッドがI / O操作を単に待機している場合でも、通常は非同期操作を行うためのスレッドを作成する方が簡単です。

非同期操作がCPUの動作を必要とする場合、通常、その操作が真に非同期であるためには、その操作が別のスレッドで発生する必要があります。それでも、実際には複数の実行ユニットがある場合にのみ非同期になります。

いいえ、非同期呼び出しには常にスレッドが含まれるわけではありません。

通常は、呼び出し元と並行して継続する何らかの操作を開始します。ただし、その操作は、別のプロセス、OS、他のハードウェア(ディスクコントローラーなど)、ネットワーク上の他のコンピューター、または人間によって処理される場合があります。スレッドは、物事を並行して行う唯一の方法ではありません。

マルチスレッドとは、同じプロセスで発生する複数の操作を指します。非同期プログラミングはプロセス全体に広がります。たとえば、私の操作がWebサービスを呼び出す場合、スレッドはWebサービスが戻るまで待つ必要はありません。ここでは、非同期プログラミングを使用して、スレッドが別のマシンのプロセスの完了を待たないようにします。そして、Webサービスからの応答の取得を開始すると、メインスレッドを中断して、Webサービスがリクエストの処理を完了したと言うことができます。これで、メインスレッドが結果を処理できます。

JavaScriptはシングルスレッドで非同期です。たとえば、XmlHttpRequestを使用する場合、応答が返されたときに非同期に実行されるコールバック関数を提供します。

John Resigは、タイマーがJavaScriptでどのように機能するかに関連する問題についての良い説明があります

Windowsは、実際のスレッドをサポートする前に、メッセージループを使用するプリエンプティブでない時間(バージョン2.13、3.0、3.1など)以降、常に非同期処理を行いました。あなたの質問に答えるために、いいえ、非同期処理を実行するスレッドを作成する必要はありません。

非同期呼び出しは、呼び出しを呼び出したシステム/デバイス上で発生する必要さえありません。そのため、非同期呼び出しが現在のプロセスのスレッドを必要とするのかという質問であれば、答えはノーです。ただし、非同期リクエストを処理するどこかに実行スレッドが存在する必要があります。

実行のスレッドはあいまいな用語です。初期のMacintoshやWindows OSなどの協調タスクシステムでは、実行のスレッドは、別のスタック、命令ポインターなどを実行する要求を行ったプロセスと同じである可能性があります。 、通常は、プロセス内(同じプロセス内)の場合は別のスレッドによって処理される呼び出し、プロセス間である場合は別のプロセスによって処理される呼び出しを意味します。

通常、プロセス間(またはプロセス間)通信(IPC)はプロセス内通信を含むように一般化されることに注意してください。実行が実行されます。

一部のシステムでは、コールバックを使用する一部の機能でカーネルの同時実行性を利用できます。かなりあいまいなインスタンスでは、非同期IOコールバックを使用して、Macシステム6-8の先制のないマルチタスク時代に、ノンブロッキングインターネットサーバーを実装しました。

このようにして、同時実行ストリームを「イン」することができます。スレッドなしでそのままプログラミングします。

非同期とは、何か(関数呼び出し、デバイスなど)が終了するのを待っているプログラムをブロックしないことを意味します。別のスレッドに実装することもできますが、同期タスクに専用のスレッドを使用し、何らかのイベントシステムを介して通信し、非同期のような動作を実現することも一般的です。

シングルスレッドの非同期プログラムの例があります。次のようなもの:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results

非同期呼び出しの性質上、呼び出しの進行中にアプリケーションの実行を継続する場合は、新しいスレッドをスポーンするか、少なくとも非同期コールバックを処理するためだけに作成した別のスレッドを利用する

場合によっては、状況に応じて、非同期メソッドを呼び出しても、ユーザーには同期しているように見せることができます(つまり、非同期メソッドが完了を通知するまでブロックします)。これは、 WaitForSingleObject などのWin32 APIを介して実現できます。 >

非同期操作は、開始後にバックグラウンドで続行する操作であり、呼び出し側が他のコードを実行する前に終了を待つことを強制しません。

応答が到着するまで呼び出しプログラム(またはスレッド)をブロックする代わりに、非同期(非ブロックとも呼ばれます)実装は、データベースまたはWebサービスなどにリクエストを送信し、すぐに戻り、プログラムを続行させますリモートサービスが応答を送信している間に他のコードを実行する。応答が到着すると、システムはコールバックを実行し(環境に応じて、メッセージループまたは別のIO完了ポートスレッドで)、コードが応答を処理できるようにします。

マルチスレッドは、一度に複数の実行スレッドを実行することを意味します。このモデルでは、すべての操作は依然として同期ですが、CPUは同期操作の複数のスレッドを同時に実行します。

マルチスレッドは、マルチコアプロセッサで複数の(独立した)CPUバウンド操作を呼び出す場合に最も有効です。たとえば、画像内のすべてのピクセルを個別に分析するプログラムは、画像を各CPUコアの1つのストリップに分割し、それから各ストリップを独自のスレッドで同時に分析できます。

詳細はこちら- https:// blog。 slaks.net/2014-12-23/parallelism-async-threading-explained/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top