web-dev-qa-db-ja.com

非同期対同期実行、それは本当にどういう意味ですか?

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

1029
tush1r

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

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

さて、あなたがミックスに複数のコア/プロセッサを導入した場合、事は実際に同時に起こり得るのです。オペレーティングシステムは、最初のプロセッサの1つのスレッドに時間を割り当ててから、同じプロセッサのブロックを別のプロセッサの別のスレッドに割り当てます。これらすべてのことは、あなたが自分のコードで作業を続けたり他のことをすることができる間、オペレーティングシステムがあなたのタスクの完了を管理することを可能にすることです。

非同期プログラミングは、同時に行うことができるときに物事がどのように結び付くかという意味論のため、複雑なトピックです。この件に関してはたくさんの記事や本があります。見てね!

1492
Adam Robinson

同期/非同期はマルチスレッドを処理しません。

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

同期(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タイムスライス

技術的には、同期/非同期の概念は本当にスレッドとは何の関係もないです。一般に、同じスレッドで実行されている非同期タスクを見つけることはまれですが、可能性があります(例については以下を参照)およびcommonseparateスレッドで同期的に実行されている2つ以上のタスクを見つけるには...いいえ、同期/非同期の概念はsolely他の(最初の)タスクが完了する前に2番目以降のタスクを開始できるかどうか、または待機する必要があるかどうか。以上です。タスクが実行されるスレッド(またはスレッド)、プロセス、CPU、または実際にどのハードウェアが実行されるかは関係ありません。確かに、この点を示すために、これを示すためにグラフィックを編集しました。

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

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

1065
Charles Bretana

簡単に言えば、

同期

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

非同期

あなたは他の多くの人と一緒にレストランにいます。あなたはあなたの食べ物を注文します。他の人も自分の食べ物を注文することができます、彼らは注文する前にあなたの食べ物が調理され、あなたに提供されるまで待つ必要はありません。 人々は調理されるとすぐに彼らの食べ物を提供するでしょう。

556
themightysapien

類推による簡単な説明

同期実行

私の上司は忙しい人です。彼は私にそのコードを書くように言う。私は彼に言う:罰金。私は始めて、彼は私の後ろに立って、私の肩から、ハゲタカのように私を見ています。私は「Dude、WTF:私がこれを終えている間にあなたが行って何かをしてみませんか?」のようなものです。

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

非同期実行

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

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

271
BKSpurgeon

同期実行 実行は単一の系列で行われることを意味します。 A->B->C->D。これらのルーチンを呼び出している場合、Aが実行されてから終了し、Bが開始してから終了し、Cが開始します。

非同期実行 を使用すると、ルーチンを開始し、次に開始するときにバックグラウンドで実行させます。その後、ある時点で、「これが終了するのを待ちます」と言ってください。もっと似ている:

開始 A->B->C->D-> 待機 Aが終了するのを待つ

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

81
Reed Copsey

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

例として:

    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

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

50
Ragoczy

一言で言えば、同期とは2つ以上のプロセスを指します ' 開始 終了 点、NOT彼らの 実行 。この例では、プロセスAのエンドポイントはプロセスBの開始ポイントと同期しています。

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

一方、非同期プロセスは、notの開始位置と終了位置を同期させます。

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

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

更新:Charles Bretanaは 彼の答え を改善したので、この答えは今は単純な(潜在的に単純化されすぎた)ニーモニックです。

44
entr0p3te

これはちょっとした説明にすぎないと思いますが、それでも実際の例を使用して明確にします。

小さな例:

オーディオの再生には3つのステップがあります。

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

あなたのオーディオプレイヤーがすべての曲のために順番にステップ1、2、3をするならば、それは同期です。曲が実際にフェッチされ解凍されるまで、曲を聴くためにしばらく待つ必要があります。

あなたのオーディオプレイヤーが互いに独立してステップ1、2、3を行う場合、それは非同期です。すなわち、[1]オーディオ1を再生している間(ステップ3)、それがハードディスクからオーディオ3を並行してフェッチし(ステップ1)、オーディオ2を並行して解凍する場合。 (step 2)あなたはフェッチや解凍を待つことなく曲を聞くことになるでしょう。

33
aJ.

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

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

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

20

A> b> c> d>のようなシーケンスを実行するときに、実行の途中で失敗した場合:

a
b
c
fail

それから我々は最初からやり直す:

a
b
c
d

これは同期的です

しかし、同じ順序で実行すると、a> b> c> d>のようになり、途中で失敗します。

a
b
c
fail

...しかし最初からやり直す代わりに、失敗したところからやり直します。

c
d

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

14
mohamed tharik

同期プログラミングモデル - スレッドが1つのタスクに割り当てられ、作業を開始します。タスクが完了すると、次のタスクに使用できます。このモデルでは、実行中のタスクを途中で別のタスクに引き継ぐことはできません。このモデルがシングルおよびマルチスレッド環境でどのように機能するかを説明しましょう。

Single Threaded - 作業するタスクがいくつかあり、現在のシステムが単一のスレッドしか提供していない場合、タスクは1つずつスレッドに割り当てられます。それは絵として描くことができる
Synchronous Single Threaded

Multi-Threaded - この環境では、以前はこれらのタスクを実行して作業を開始できる複数のスレッドがありました。つまり、スレッドのプール(要件と利用可能なリソースに基づいて新しいスレッドを作成することもできます)と多数のタスクがあるということです。それで、これらのスレッドはこれらの上で働くことができます
Synchronous Multi-Threaded

非同期プログラミングモデル - 同期プログラミングモデルとは反対に、ここでスレッドは一度タスクの実行を開始し、それを途中で保持し、現在の状態を保存して別のタスクの実行を開始できます。

シングルスレッドAsynchronous Single Threade

マルチスレッドAsynchronous Multi-Threaded

もっとここに - https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/ /

14
yoAlex5

とても簡単な例として、

_同期_

10人の生徒が道路上の列として歩くように指示されたと想像してください。 

3人目の生徒は、靴ひもをほぐしました。今、彼女はやめてもう一度縛りました。

彼女の後ろにいるすべての生徒たちは立ち止まっていて、今度は彼女がそれを結びつけるのを待っています。

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

_非同期_

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

3人目の靴ひもがほどきました。彼女は再び縛られるのをやめた。 

しかし、誰も彼女がそれを結び付けるのを待っていません。他の誰もが同じペースで彼らの前と同じようにまだ歩いています。

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

あなたはParallel vs Seriesと同期を混同しています。同期とは、同時にすべてを意味します。同期化されたとは、連続的にまたは一定の間隔で意味することができる各他に関するものを意味する。プログラムがすべてを実行している間、それは直列に実行されています。辞書を手に入れてください...これが私たちが甘味のないお茶を飲んでいる理由です。あなたはお茶か甘いお茶を飲んでいます。

7
Joe

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

6
Mike

同期操作は、呼び出し元に戻る前に機能します。

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

4
Maxim Eliseev

これを説明するためのGIFを作成しました。役立つことを願います。見て、3行目は非同期で、他の行は同期です。 3行目より前の行はすべて、作業が完了するまで待つ必要がありますが、3行目は非同期であるため、次の行(4行目)は3行目を待たず、5行目は4行目で作業を終了します4、5、6、7行目は非同期ではないため、6行目は5行目、7行目は6を待つ必要があります。 line 3 is asynchronous and others are synchronous

3

朝食の作り方の例を使う

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

あなたが料理の経験があるならば、あなたはそれらの指示を非同期的に実行するでしょう。あなたは卵のために鍋を温め始めて、それからベーコンを始めます。パンをトースターに入れてから卵を出します。プロセスの各ステップで、タスクを開始してから、注意を向ける準備ができているタスクに注意を向けます。

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

並列アルゴリズムの場合は、複数のクック(またはスレッド)が必要です。卵を作り、ベーコンを作ります。それぞれがその1つのタスクだけに焦点を合わせます。各料理人(または糸)は、ベーコンが弾く準備ができているか、トーストが飛び出すのを待って同期的にブロックされます。

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

1
Hla Min Swe

私はそれを考えるための良い方法は古典的なランニングリレーレースだと思います

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

非同期 :同じリレーレースの異なるチームのメンバーのようなプロセスが追跡している場合、それらは互いに非同期で、同じレース内で実行および停止します(プログラム全体の実行)。

それは理にかなっていますか?

1
Sharif

同期実行の " 同時に "定義(これは混乱を招くことがあります)に関しては、これを理解するのに良い方法があります。

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

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

1
docta_faustus

Synchronizeの異なる英語の定義は Here です。

座標;組み合わせる。

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

そのため、非同期タスクは他のタスクと協調しませんが、同期タスクISは他のタスクと協調し、別のタスクが開始する前に完了します。 

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

1
Greg Gum

同期とは、文字通り、同時に作業を行うことを意味します。世界中の複数の人間/オブジェクトが同時に複数のことを行うことができますが、コンピュータを見ると、プロセスが相互に作用する同期手段、つまりプロセスが互いの復帰に依存しているという意味です正しい順序で次々と。非同期とは、プロセスが連携して動作しないことを意味しますが、同時に動作することもあります(マルチスレッドの場合)が、独立して動作します。 

0
Saptarshi

同期とは、タスクを1つずつ順番に実行することを意味します。一台ずつ移動先にたどり着くために友人同士で共有する必要がある唯一の乗り物があるとします。
非同期の場合、各友達はレンタカーを借りて目的地に着くことができます。

0
Rohit