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


133

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

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

ウィキペディアは言う

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

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



1
JavaScriptにはスレッドはありませんが、非同期のメソッド呼び出しがあります。
Ajedi32 2015

1
1つのプロセスが複数のサブプロセスを管理するシステムでは、制御プロセスはサブプロセスの非同期操作を提供できます。JavaScriptの場合、ブラウザーは計算ストリームを提供します。一部の関数が非同期呼び出しを行うと、ブラウザはその関数のコンテキストを保存できます。これで、同じ単一のブラウザースレッドがコンテキストを変更して、別の関数の実行を再開できます。一方、従来のマルチスレッドプログラムでは、1つのスレッドが1つの関数を実行して、別のスレッドが別の関数を実行できるようにします。各スレッドは独自の機能を同期的に実行します。
Mike

回答:


82

この質問は答えるのが一般的すぎます。

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

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

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


7
つまり、基本的には私は次のように言っています。マルチスレッド==複数のスレッドを使用して、[理想的には]複数のプロセッサから利益を得ることができるプロセッサ集約型タスクの処理上の利点と、非同期の状況における利点を提供します。Asynchrony ==プロセスはそれを実行しますが、プロセスを呼び出した状態は、プロセスが完了するのを待つ必要はありません。(これを行うために必ずしも複数のスレッドを使用する必要はありません-つまり、他のハードウェアコンポーネントが責任を負う場合があります)。
エヴァンセビー2011

6
@Michael-非同期プログラミングが単一スレッドでどのように発生するかを例を挙げて説明していただけませんか?
Kumar Vaibhav 2013年

7
@KumarVaibhav-最も一般的な例は、単一のスレッドがキュー(Windowsメッセージキューなど)のアイテムを処理する場合です。プログラムが独自のキュー(一般的なパターン)にアイテムを送信する癖がある場合、アイテムを送信するコードは、操作が完了するのを待たずに、単に戻ります。操作はやがてメインループによって処理されます。
Michael Kohne 2013年

3
コードの記述方法と実行方法には違いがある場合があります。たとえば、C#では、非同期タスクを開始するメソッドを使用できます。このメソッドは完全に非同期対応であり、タスクの完了を待たずに他のことを実行できます。ただし、CLRはタスクをインライン化して同期的に実行することもできます。
Mike

どのスレッドが待機中のタスクを実行しますか?a-syncでマークされたメソッドは、awaitキーワードに到達するまで同期的に実行されます。この時点で、どのスレッドがこの待機可能なタスクを実行しますか?

102

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

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

非同期操作でCPUが機能する必要がある場合、通常、その操作を別のスレッドで実行して、本当に非同期にする必要があります。それでも、実行ユニットが複数ある場合のみ、非同期になります。


1
よく説明しました、ありがとうございます。ここで質問があります。「たとえば、非同期操作がI / Oの場合、CPUはI / Oが完了するのを待つ必要はありません。操作を開始するだけで済みます。」私の質問は、プログラムがシングルスレッドで、コード行3でI / O操作を呼び出し、I / O操作の完了を待たずに行3で操作を開始して行4を実行する方法です。 ?私にとっては、I / O操作の完了を待たずに4行目を実行するために、新しいスレッドの3行目のコードを配置する必要があります。[Java pgmパースペクティブ]
スパイダーマン

1
その理由は、CPUが待機する必要はありませんが、CPUはI / O操作が完了するのを待機するからです。そのような場合、Javaでは非同期呼び出しを別のスレッドで実行する必要があると結論付ける必要があります。私が間違っている場合は修正してください。または新しいSO qnを投稿する必要がある場合はお知らせください
スパイダーマン

@spiderman Node.jsなどの一部の言語には、非同期プログラミングモデルがあります。言語とランタイムは、IO操作が完了する前でも、4行目を同じスレッドで実行できる組み込みを提供します。これは、IOが終了したときにランタイムが呼び出すコールバックを提供する3行目によって実現されます。
jrahhali

@spiderman多分... OSの非同期関数は単にfalseまたは何かを直接返します。
ビョンインユン2018

18

いいえ、非同期呼び出しは常にスレッドを伴うわけではありません。

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


12

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

John Resigは、JavaScriptでタイマーがどのように機能するかという関連する問題を適切に説明しています


12

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


私は少し同意しません。私は、非同期IO完了を使用して複数の同時要求を処理するシングルスレッドHTTPサーバーを作成しました。非同期では、複数の実行パスで発生する必要はありません。それは、複数の計算ストリームがオーバーラップできることを意味します。別の見方をすると、シングルスレッドのOSでは、2つのプロセスを「同時に」実行できます。各プロセスの観点から、それらは同期して実行されています。ただし、OSの観点からは、非同期で動作しています。
Mike

11

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


@dmckee-異なるシステムが同じように進化する方法は興味深いです。
のOtavioDécio

8

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

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

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


7

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

あなたは同時実行を持っているこの方法では、スレッドせずに、あなたのプログラム「の中の」ストリームなど


5

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

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

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

2

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

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


これは一部のシステムに当てはまりますが、すべてではありません。カーネルを別のスレッドと呼ばない限り、Unixでは別のスレッドを生成したり利用したりする必要はありません。
クレイグS

これはWindowsにも当てはまりません。たとえば、重複したI / Oは非同期です。
Jason Orendorff、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.