非同期実行と同期実行の違いは何ですか?[閉まっている]


1186

非同期実行と同期実行の違いは何ですか?


...または「順次vs並列」実行...真の並列処理には複数のコアが必要ですが、それ以外の場合は論理的にインターリーブされます。
samis

8
私は両方の用語を混同していましたが、違いを覚えている方法は、非同期である「A JAX」の最初の「A」をスローすることです。JavaScriptで、AJAXを使用してリクエストをループで実行すると、待機しませんブラウザがフリーズしたウェブサイトのユーザーエクスペリエンスに影響を与えたくないため、お互いに処理をブロックしたり、プロセスをブロックしたりするため、すべてのリクエストは前のリクエストの応答を待たずにほぼ同時に送信されます。それは非同期です
会計士م

回答:


1748

同期的に何かを実行するとき、それが完了するのを待ってから別のタスクに移ります。非同期で何かを実行する場合、完了する前に別のタスクに進むことができます。

そうは言っても、コンピューターのコンテキストでは、これは別の「スレッド」でプロセスまたはタスクを実行することを意味します。スレッドは、作業単位として存在する一連のコマンド(コードのブロック)です。オペレーティングシステムは、複数のスレッドを管理し、別のスレッドに切り替えて処理を行う前に、スレッドにプロセッサ時間の断片( "スライス")を割り当てることができます。コアは(しゃれを許して)、プロセッサはコマンドを実行するだけでよく、一度に2つのことを実行するという概念はありません。オペレーティングシステムは、時間のスライスを異なるスレッドに割り当てることでこれをシミュレートします。

ここで、複数のコア/プロセッサを組み合わせて導入すると、実際に同時に発生する可能性があります。オペレーティングシステムは、最初のプロセッサの1つのスレッドに時間を割り当ててから、同じ時間ブロックを別のプロセッサの別のスレッドに割り当てることができます。これはすべて、オペレーティングシステムがタスクの完了を管理できるようにすることに関するものであり、コードを続行して他のことを行うことができます。

非同期プログラミングは、同時に実行できるときに物事がどのように結び付くかというセマンティクスのため、複雑なトピックです。このテーマに関する記事や本は数多くあります。見てください!


246
私を絶対に混乱させるのは、同期は「同時に」を意味しますが、上記の意味で使用される場合、それは順次を意味、非同期は「同時にではない」を意味します... ?? 誰かがこの矛盾を説明できますか?
Damien Roche

45
@Zenph:このコンテキストでは、コードのブロック全体が私たちの関心事です。同期とは、ブロックが同時に実行されることを意味します(ただし、コンポーネントは順次実行されます)。非同期とは、ブロックがすべて同時に実行されるわけではないことを意味します。
アダムロビンソン

8
非同期実行は、プログラムがメッセージをキューに送信したときにも発生します(ActiveMQ、WebSphere MQ、HornetQ、MSMQなどのメッセージングシステムの場合)。この場合、非同期呼び出しには、マルチスレッドプログラミングやOSレベルでの同時実行の処理は含まれません。
Paulo Merson

287
奇妙なことに、「同期的に」とは「同じクロックを使用する」ことを意味するので、2つの命令が同期している場合、それらは同じクロックを使用し、次々に発生する必要があります。「非同期」は「同じクロックを使用しない」ことを意味するため、指示は互いに同期していることには関係ありません。それが逆に見える理由です。この用語は、互いに指示の関係を指すものではありません。それは、時計に対する各命令の関係を参照しています。お役に立てば幸いです。
Tom Padilla

14
用語はエンジニアリングに由来します。 en.wikipedia.org/wiki/Asynchronous_system
Tom Padilla、

1151

同期/非同期はマルチスレッドで何もする必要がありません。

同期または同期とは、何らかの方法で「接続」または「依存」することを意味します。つまり、2つの同期タスクは相互に認識している必要があり、1つのタスクは、他のタスクが完了するまで開始を待機するなど、他のタスクに依存する何らかの方法で実行する必要があります。
非同期とは、それらが完全に独立していることを意味し、どちらの方法でも、開始時または実行時に、どちらも他方を考慮してはなりません。

同期(1スレッド):

1 thread ->   |<---A---->||<----B---------->||<------C----->|

同期(マルチスレッド):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

非同期(1スレッド):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

非同期(マルチスレッド):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • <>文字で表されるタスクA、B、Cの開始点と終了点。
  • 垂直バーで表されたCPUタイムスライス |

技術的には、同期/非同期の概念は、実際にはスレッドとは何の関係もありません。一般に、同じスレッドで実行されている非同期タスクを見つけるのは珍しいことですが、可能であり(例については以下を参照)、別々のスレッドで同期して実行されている2つ以上のタスクを見つけることは一般的です...いいえ、コンセプト同期/非同期の関係しているだけに、他の(最初の)タスクが完了した、またはそれを待たなければならないかどうかを前に、第2または後続タスクが開始されることができるかどうかと。以上です。タスクが実行されるスレッド(1つまたは複数)、またはプロセス、CPU、または実際にはどのハードウェアかは関係ありません。実際、この点を明確にするために、グラフィックを編集してこれを示しています。


非同期の例:

多くのエンジニアリング問題を解決するために、ソフトウェアは問題全体を複数の個別のタスクに分割し、それらを非同期で実行するように設計されています。行列の反転、または有限要素解析の問題は、良い例です。コンピューティングでは、リストのソートがその例です。たとえば、クイックソートルーチンは、リストを2つのリストに分割し、それぞれに対してクイックソートを実行し、それ自体(クイックソート)を再帰的に呼び出します。上記の例の両方で、2つのタスクは非同期で実行できます(多くの場合)。それらは別々のスレッド上にある必要はありません。CPUが1つで実行スレッドが1つしかないマシンでも、最初のタスクが完了する前に2番目のタスクの処理を開始するようにコーディングできます。唯一の基準は、1つのタスクの結果が他のタスクへの入力として必要ないことです。。タスクの開始時刻と終了時刻が重複している限り(どちらの出力も他方への入力として必要でない場合のみ可能)、使用中のスレッドの数に関係なく、非同期で実行されます。

同期の例:

タスクを順番に実行する必要があるが、別のマシンで実行する必要がある複数のタスクで構成されるプロセス(データのフェッチや更新、金融サービスからの株価情報の取得など)。別のマシンにある場合は、同期か非同期かにかかわらず、別のスレッドにあります。


92
なぜ世界で言葉はコンピュータで異なる意味をするのですか...常に私はこれに戻ってきます...辞書から...同期:同時に発生します。非同期:同時に発生しません。
Muhammad Umer 2013

17
しかし、コンピューターで見ることができるように、それは反対を意味します
Muhammad Umer

5
おそらく、命名法は、タスクの開始が他のタスクの完了と「同期」されているかどうかに基づいていますか?
Charles Bretana、2013

11
@MuhammadUmer:コンピューターの世界では、同時に発生することを並行性と呼びます。
Roy Ling

5
私見、これらの図はすべて、タスクの同期実行と非同期実行を説明しているわけではありません。たとえば、2番目の図は、非同期タスクに複数のスレッドが必要であることを示しています。実際にはそうではありません。そして、そのタスクは並行して実行する必要がありますが、これも要件ではありません。または、「同期」の図は、タスクが呼び出しサイトから非同期にディスパッチされ、シリアルタスクスケジューラで実行される方法をよく示しています;)IMO、画像は誤解を招くものです。
CouchDeveloper 2015

642

簡単に言えば:

同期

映画のチケットを取得するためのキューにいます。あなたの前の全員が1つを取得するまで、1つを取得することはできません。同じことが、あなたの後ろに並んでいる人々にも当てはまります。

非同期

あなたは他の多くの人々と一緒にレストランにいます。あなたはあなたの食べ物を注文します。他の人も食べ物を注文できます。注文する前に、食べ物が調理されて出されるのを待つ必要はありません。キッチンレストランでは、労働者が調理、料理、注文を続けています。調理するとすぐに料理が出されます。


10
誰かがリンゴと比較してリンゴを望んでいるなら; レストランのシナリオを同期させたい場合は、食べ物を注文するとき、レストランの他の全員が食べ物が到着するまで待たなければならず、食べ物を注文できるようになります。これは、本当におかしなシナリオのようです。しかし、コンピューティングの世界では、このシナリオが役立つ可能性があります。各顧客が何を望むかを決めることができず、代わりに以前の顧客が何を望むかを決定するために注文するものを調べたいとすると、注文する前に食品が到着するのを待つ必要があるのは理にかなっています。
Fonix 2017

追加するだけで...非同期操作のキューのように操作が実行されるようにすることもできます...しかし、それはまったく必須ではありません。
Sreekanth Karumanaghat 2017

5
非常にシンプルで現実的な例
マニッシュ

あなたの例をさらに進めるために、彼らはチケットを販売するためのいくつかのゲートを検討することができます。したがって、各ラインは他のラインから非同期で動作できますが、それ自体で同期して動作します!
Saeed Ahadian

334

類推による簡単な説明

同期実行

私の上司は忙しい人です。彼は私にコードを書くように言った。私は彼に言います:元気です。私は始めました、そして彼はハゲワシのように私を見ていて、私の後ろに立って、私の肩から離れています。私は「おい、WTF:これを終えている間に、なぜあなたは行って何かしませんか?」のようです。

彼は「いいえ、あなたが終わるまでここで待っています。」これは同期です。

非同期実行

ボスは私にそれをするように言って、私の仕事をすぐに待つのではなく、ボスは出かけて他の仕事をします。仕事が終わったら、上司に報告して「完了です!」と言います。これは非同期実行です。

(私のアドバイスをしてください:あなたの後ろにいる上司と一緒に仕事をしないでください。)


29
私はやった…これを辞任とするともっと面白くなる。
Daedric

91

同期実行とは、実行が単一のシリーズで発生することを意味します。 A->B->C->D。これらのルーチンを呼び出している場合は、A実行、終了、B開始、終了、C開始などのようになります。

非同期実行、あなたはルーチンを開始し、あなたがあなたの次を開始しながら、それがバックグラウンドで実行させ、その後、いくつかの点で、「最後まで、この待ち」と言います。それはもっと似ています:

スタート A->B->C->D->待ちのためのA仕上げに

利点は、、、およびまたはが(バックグラウンドで別のスレッドで)実行されている間に実行できるためB、リソースをより有効に活用して、「ハング」または「待機」を減らすことができます。CDA


@ Reed Copsey ......このような良い説明をありがとう..... Async-Execについてさらに情報が欲しいだけ...... Async Execでのあなたの答えに基づいて....スタートA-> B-> C-> D-> Aが完了するのを待つ...したがって、すべてのA、B、C、Dが一度に開始されます......そして、Aが完了するのを待ちます.....そうなりますBはAの終了後にのみ終了し、CはBの後に終了します。または、Bが最初に終了し、次にAが終了できますか?
Devrath 2013

8
@Devrath操作は任意の順序で終了できます。
リードコプシー2013

59

簡単に言えば、同期とは、2つ以上のプロセスの開始点と終了点であり実行ではありません。この例では、プロセスAのエンドポイントがプロセスBの開始ポイントと同期されています。

同期
   | -------- A -------- |
                     | -------- B -------- |

一方、非同期プロセスでは、開始プロセスとエンドポイントが同期されていません

非同期
   | -------- A -------- |
         | -------- B -------- |

プロセスAがプロセスBとオーバーラップしている場合、それらは並行してまたは同期して(辞書定義)実行されているため、混乱が生じます。

更新:Charles Bretanaが彼の回答を改善しため、この回答は単純な(潜在的に過度に単純化された)ニーモニックになりました。


2
Charles Bretanaの回答のコピー
Dinesh Saini

2
@DineshSaini-私の図は少し異なります。わかりやすくするために、どちらの場合もBの上にAを配置し、開始と終了が同期しているかどうかを強調しました。Charles Bretanaの図は、何も「同期」せずに同期プロセスを順番に配置しています。(私はそれを「改善する」ために彼の答えの下でコメントするつもりでしたが、新しい図を表示するだけの方が簡単であることに気づきました。)
entr0p3te

素晴らしい図。一番上のSYNCを呼び出す方法は、他のイベントが介入していない、またはAの完了を妨害していないという意味で、上の図のAの開始と終了が事実上同時にであると思います。Syncは、CPUレジスタへの追加など、開始と終了が非常に近いため、実際にはディクショナリ同期になるように、単一のタスクを分離して参照できます。
Dean Radcliffe、2016

55

同期とは、呼び出し側が応答または完了を待機することを意味し、非同期の場合は、呼び出し側が続行し、応答が後で来ることを意味します(該当する場合)。

例として:

    static void Main(string[] args)
    {
        Console.WriteLine("Before call");
        doSomething();
        Console.WriteLine("After call");
    }

    private static void doSomething()
    {
        Console.WriteLine("In call");
    }

これは常に出力されます:

Before call
In call
After call

しかし、doSomethingを非同期(複数の方法で実行)にすると、出力は次のようになります。

Before call
After call
In call

非同期呼び出しを行うメソッドは、すぐに次のコード行に進むためです。非同期操作では実行順序を保証できないため、「できた」と言います。スレッドのタイミングなどによっては、オリジナルとして実行することもできます。


34

これは少し回りくどい説明だと思いますが、それでも実際の例を使用して明確にします。

小さな例:

オーディオの再生に3つのステップが含まれているとします。

  1. ハードディスクから圧縮された曲を取得する
  2. オーディオを解凍します。
  3. 非圧縮オーディオを再生します。

オーディオプレーヤーがすべての曲に対して順次ステップ1、2、3を実行する場合は、同期しています。曲が実際に取得されて解凍されるまで、曲を聞くにはしばらく待つ必要があります。

オーディオプレーヤーが互いに独立してステップ1、2、3を実行する場合、非同期です。すなわち。オーディオ1の再生中に(ステップ3)、オーディオ3をハードディスクから並行してフェッチし(ステップ1)、オーディオ2を並行して解凍した場合。(ステップ2)フェッチと解凍をあまり待たずに曲を聞くことができます。


32

同期および非同期操作は、現在のタスクに関連する新しいタスクの実行順序に関するものです。テーブル上の2つのタスク:現在のタスクと新しいタスク

同期(ブロッキング)-タスクが1つずつ実行されることを意味します。次のタスクは、前のタスクが終了した後にのみ開始されます。終了するTask 2まで開始されませんTask 1

非同期(非ブロッキング)–タスクを実行するとすぐに制御が戻り、コードを実行して結果を後で通知する(コールバック、機能など)ことを約束します。終了していなくTask 2ても実行されますTask 1

同期と非同期についての答え:iOSAndroid


同期マルチスレッドの例の図は、同時に実行されているスレッドを示しているように見えますか?
samis

@sαmosΛrisタイムラインを示すX軸のようなスレッドと見なすことができます
yoAlex5

x軸は、従来、空間次元として使用されています。時間のt軸-アルゴリズムの複雑さの分析で見られる重要な違い。
samis

23

簡単に言うと、非同期実行はバックグラウンドで何かを行っています。

たとえば、インターネットからファイルをダウンロードする場合は、同期機能を使用してファイルをダウンロードできますが、ファイルのダウンロードが完了するまでスレッドがブロックされます。これにより、アプリケーションがユーザー入力に応答しなくなる可能性があります。

代わりに、非同期方式を使用してバックグラウンドでファイルをダウンロードできます。この場合、ダウンロード機能はすぐに戻り、プログラムの実行は通常どおり続行されます。すべてのダウンロード操作はバックグラウンドで実行され、プログラムが完了すると通知されます。


1
あなたの例はどのように速くなるでしょうか?最終的にはダウンロード期間が終了するまでファイルを再生することはできません。説明できる?私は非同期を理解していないと思いますが、それはおそらく私ですが、他のプロセスが実行されている間(ダウンロードを取得)に、他のステップまたはプロセスは何をしているのでしょうか?私はあなたがあなたのアプリでその非同期プロセスを受け取る(ダウンロード)するまで何ができるのかを意味します...私はそれを取得しません。それでは、どちらの状況でも、ユーザーに何らかの待機メカニズムを表示する必要がありますか?
PositiveGuy

4
速くする必要はありません。メインスレッドをブロックしないため、他の種類のユーザー入力を処理できます。たとえば、ユーザーがダウンロードをキャンセルしたり、別のファイルのダウンロードを同時に開始したりする場合があります。
のMichałPiaskowski

19

本当に簡単な例として、

同期

3人の生徒が道路でリレーレースを実行するように指示されたと想像してください。

1人目の生徒は指定された距離を走り、停止してバトンを2番目に渡します。誰も走り始めていません。

1------>
        2.
                3.

2人目の生徒がバトンを取得すると、指定された距離を走り始めます。

      1.
        2------>
                3.

2人目の生徒は靴ひもをほどきました。今、彼女は立ち止まり、再び縛られています。このため、2回目の終了時間が延長され、3回目の開始時間が遅れました。

      1.
        --2.--->
                3.

このパターンは、3番目が2番目からバトンを取得してレースを終了するまで続きます。

非同期

同じ道を歩いている10人のランダムな人を想像してみてください。もちろん、彼らは順番待ちではなく、道路上のさまざまな場所をさまざまなペースでランダムに歩いています。

2人目の靴ひもがほどかれた。彼女はそれを再び縛りつけるために立ち止まった。

しかし、誰も彼女が縛られるのを待っていません。他のすべての人は、以前と同じように、同じペースで歩き続けています。

10-->    9-->
   8--> 7-->   6-->
 5-->     4-->
1-->   2.    3-->

18

これを説明するためにgifを作成しました。役立つことを願っています:見て、3行目は非同期で、他は同期です。ライン3の前のすべてのラインはラインが動作を完了する前に待機する必要がありますが、ライン3は非同期であるため、次のライン(ライン4)はライン3を待機せず、ライン5はライン4が動作を完了するのを待機する必要があります。また、ライン4、5、6、7は非同期ではないため、ライン6はライン5と7を6の間待機する必要があります。 ライン3は非同期で、その他は同期です


12

a> b> c> d>のようなシーケンスを実行するとき、実行の途中で次のようなエラーが発生した場合:

a
b
c
fail

次に、最初からやり直します。

a
b
c
d

これは同期です

ただし、実行する同じシーケンスa> b> c> d>があり、途中でエラーが発生した場合:

a
b
c
fail

...しかし、最初からやり直すのではなく、失敗した時点からやり直します。

c
d

...これは非同期として知られています。


1
例に対してより多くのコンテキストを提供することによって、あなたが意味するところをより正確にすることができますか
krichard

5
この答えは単に正しくありません。
ローン侯爵

7

同期対並列とシリーズを混同しています。同期とは、同時にすべてを意味します。同期したとは、互いに関連していて、連続して、または一定の間隔で意味することができます。プログラムはすべてを実行している間、連続して実行されます。辞書を入手してください...これが私たちが甘いお茶を持っている理由です。あなたはお茶または甘味のあるお茶を持っています。


3
実際、「同期」とは、命令とクロックの関係を指します。命令間の関係ではありません。そのため、「同期」とは逆に見えるというのは、実際には次々と意味します。しかし、命令はクロックに同期しています。「非同期」とは、「いつでも、いつ発生してもかまわない」という意味です。命令をクロックに同期させる必要はありません。はい、辞書の定義がありますが、正しい状況を定義していることを確認する必要があります。
Tom Padilla

1
同期とは、コンピューティングにおいて「同時にすべて」を意味するものではありませ。あなたは同期と同期、そしてお茶と甘いお茶との「パラレル対シリーズ」を混同しています。答えはまったく意味がありません。
ローン侯爵

7

同期とは、基本的に一度に1つの処理しか実行できないことを意味します。非同期とは、一度に複数の処理を実行でき、次の処理に進むために現在の処理の実行を終了する必要がないことを意味します。


同時に実行される複数のものは、非同期ではなくマルチスレッドと呼ばれていません。
Sreekanth Karumanaghat 2017

7

朝食の作成方法の例を使用してください

  1. 一杯のコーヒーを注ぐ。
  2. フライパンを熱し、2個の卵を炒める。
  3. ベーコンを3枚炒める。
  4. 2枚のパンをトーストします。
  5. トーストにバターとジャムを追加します。
  6. オレンジジュースを一杯注ぎます。

料理の経験がある場合は、これらの命令を非同期で実行します。あなたは卵の鍋を温め始め、次にベーコンを始めます。パンをトースターに入れて、卵を作ります。プロセスの各ステップで、タスクを開始してから、準備ができているタスクに注意を向けます。

朝食を調理することは、並列ではない非同期作業の良い例です。1人のユーザー(またはスレッド)がこれらのすべてのタスクを処理できます。朝食の類推を続けると、最初の人が完了する前に次のタスクを開始することで、一人が非同期に朝食を作ることができます。誰かがそれを見ているかどうかにかかわらず、調理は進行します。卵の鍋を温め始めたら、すぐにベーコンを炒めることができます。ベーコンが始まったら、パンをトースターに入れます。

並列アルゴリズムの場合、複数のクック(またはスレッド)が必要になります。卵を作ったり、ベーコンを作ったり。それぞれがその1つのタスクだけに集中します。各クック(またはスレッド)は同期的にブロックされ、ベーコンが反転する準備ができるか、トーストがポップするのを待ちます。

非同期プログラミングの概念からの参照


4

同期操作は、呼び出し元に戻る前に作業を行います。

非同期操作は、呼び出し元に戻った後、その作業の(ほとんどまたはすべて)を行います。


リンクは死んでいます。
2017年

1

「に関しては、同時に(時々混乱さ)同期実行の」定義、ここではそれを理解するための良い方法です:

同期実行コードブロック内のすべてのタスクは、すべて同時に実行されます。

非同期実行コードのブロック内のすべてのタスクがすべて同時に実行されるわけではありません。


私は..私はdownvoteは物事があること不正確な声明のためだったと思います「実用的な目的のために」あなたが「同時に効果的に」言った場合よりこれに同意する、またはだろう実際に同じTIEMで行わ得ています。
Dean Radcliffe

1

それを考える良い方法は古典的な走るリレーレースだと思います

同期:同じチームのメンバーのようなプロセスは、バトン(前のプロセス/ランナーの実行の終了)を受け取るまで実行されませんが、それらはすべて互いに同期して動作します。

非同期:同じリレーレーストラック上の異なるチームのメンバーのようなプロセスは、実行および停止し、互いに非同期ですが、同じレース(プログラム全体の実行)内にあります。

それは意味がありますか?


1

Synchronizeの別の英語の定義はこちら

座標; 組み合わせる。

それは「同時に起こる」よりも良い定義だと思います。それも定義ですが、コンピューターサイエンスでの使用方法に合うものだとは思いません。

したがって、非同期タスクは他のタスクと調整されていませんが、同期タスクは他のタスクと調整されているため、あるタスクが終了してから別のタスクが開始されます。

それがどのように達成されるかは別の問題です。


0

同期とは、タスクを1つずつ実行するキューウェイの実行を意味します。目的地に到着するために友人間で共有する必要がある車両のみが1台の車両で共有されるとします。
非同期の場合、各友達はレンタカーを借りて目的地に到着できます。


0

はい、同期とは同時に、文字通り、すべて一緒に作業を行うことを意味します。世界中の複数の人間/オブジェクトは同時に複数のことを実行できますが、コンピューターを見ると、プロセスが連携して動作する同期の意味であり、プロセスが互いに戻ることに依存しているため、プロセスが実行されます適切な順序で次々と。非同期とは、プロセスが一緒に動作しないことを意味しますが、同時に動作する場合があります(マルチスレッド上にある場合)が、独立して動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.