web-dev-qa-db-ja.com

非同期とマルチスレッド-違いはありますか?

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

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

ウィキペディアによると

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

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

127
Ted Smith

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

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

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

それを超えて、より具体的になる必要があります。

80
Michael Kohne

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

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

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

97
karunski

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

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

17
Jason Orendorff

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

12
Murugan Gopalan

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

John Resigが JavaScriptでのタイマーの動作 の方法に関連する問題について適切に説明しています。

11

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

10
Otávio Décio

非同期呼び出しは、呼び出しを呼び出したものと同じシステム/デバイスで発生する必要さえありません。質問が、非同期呼び出しが現在のプロセスのスレッドを必要とする場合、答えはノーです。ただし、非同期要求を処理するどこかに実行のスレッドが存在する必要があります。

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

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

8
Mike

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

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

6
dmckee

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

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

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results
4
Milan Babuškov

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

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

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

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

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

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

続きを読む こちら

1
yoAlex5