非同期実行と同期実行の違いは何ですか?
22 に答える
何かを同期的に実行するときは、それが完了するのを待ってから別のタスクに進みます。何かを非同期で実行すると、完了する前に別のタスクに移ることができます。
そうは言っても、コンピューターのコンテキストでは、これは別の「スレッド」でプロセスまたはタスクを実行することになります。スレッドは、作業単位として存在する一連のコマンド (コードのブロック) です。オペレーティング システムは、複数のスレッドを管理し、スレッドにプロセッサ時間の一部 (「スライス」) を割り当ててから、別のスレッドに切り替えて作業を行うことができます。その核心 (しゃれを許してください) では、プロセッサはコマンドを実行するだけで、一度に 2 つのことを行うという概念はありません。オペレーティング システムは、時間のスライスを異なるスレッドに割り当てることで、これをシミュレートします。
ここで、複数のコア/プロセッサを組み合わせて導入すると、実際には同時に発生する可能性があります. オペレーティング システムは、最初のプロセッサの 1 つのスレッドに時間を割り当ててから、同じ時間ブロックを別のプロセッサの別のスレッドに割り当てることができます。これはすべて、オペレーティング システムがタスクの完了を管理できるようにする一方で、コードを実行して他のことを実行できるようにするためのものです。
非同期プログラミングは、同時に実行できる場合に物事がどのように結びつくかというセマンティクスのため、複雑なトピックです。このテーマに関する記事や本は数多くあります。見てください!
簡単に言えば:
同期
映画のチケットを購入するために列に並んでいます。あなたの前にいる全員が 1 つ取得するまで、1 つ取得することはできません。同じことが、あなたの後ろに並んでいる人にも当てはまります。
非同期
あなたは他の多くの人々と一緒にレストランにいます。あなたは食べ物を注文します。他の人も自分の食べ物を注文できます。注文する前に、あなたの食べ物が調理されて提供されるのを待つ必要はありません。キッチンでは、レストランの従業員が絶え間なく調理、提供、注文を受けています。人々は料理ができたらすぐに提供されます。
類推による簡単な説明
(あなたが覚えておくのを助けるために与えられた物語と写真)。
同期実行
私の上司は忙しい人です。彼は私にコードを書くように言います。私は彼に言います:大丈夫です。私が始めると、彼は私の後ろに立って、私の肩から離れて、ハゲタカのように私を見ています。私は「おい、WTF: 私がこれを終わらせるまでに何かしませんか?」みたいな感じです。
彼は、「いいえ、あなたが終わるまでここで待っています。」これは同期です。
非同期実行
上司は私にそれをするように言い、そこで私の仕事を待つのではなく、上司は出かけて他の仕事をします。仕事が終わったら、上司に報告して、「もう終わりだ!」と言うだけです。これが非同期実行です。
(私のアドバイスを聞いてください:あなたの後ろにいる上司と一緒に仕事をしないでください。)
同期実行とは、実行が単一のシリーズで発生することを意味します。 A->B->C->D
. これらのルーチンを呼び出している場合は、A
実行、終了、B
開始、終了、C
開始などです。
非同期実行では、ルーチンを開始し、次のルーチンを開始している間バックグラウンドで実行し、ある時点で「これが完了するまで待ってください」と言います。それはもっと似ています:
開始 終了するのをA->B->C->D->
待ちますA
利点はB
、 、C
、および orがまだ実行されているD
間A
に (バックグラウンドで、別のスレッドで) 実行できるため、リソースをより有効に活用し、「ハング」または「待機」を減らすことができることです。
簡単に言うと、同期とは、2 つ以上のプロセスの実行ではなく、開始点と終了点を指します。この例では、プロセス A のエンドポイントがプロセス B の開始点と同期されます。
同期 |--------A--------| |--------B--------|
一方、非同期プロセスでは、開始と終了が同期されません。
非同期 |--------A--------| |--------B--------|
プロセス A がプロセス B とオーバーラップしている場合、それらは同時にまたは同期的に実行されているため (辞書の定義)、混乱が生じています。
更新: Charles Bretana がanswerを改善したため、この回答は単純な (単純化しすぎている可能性がある) ニーモニックになりました。
同期とは、呼び出し元が応答または完了を待機し、asynchronous
呼び出し元が続行し、応答が後で来ることを意味します (該当する場合)。
例として:
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
asynchronous
(複数の方法で) 作成すると、出力は次のようになります。
Before call
After call
In call
非同期呼び出しを行うメソッドは、すぐに次のコード行に進むためです。非同期操作では実行順序が保証されないため、「できる」と言います。スレッドのタイミングなどによっては、元のように実行することもできます。
簡単に言うと、非同期実行はバックグラウンドで処理を行っています。
たとえば、インターネットからファイルをダウンロードする場合、同期関数を使用してそれを行うことができますが、ファイルのダウンロードが完了するまでスレッドがブロックされます。これにより、アプリケーションがユーザー入力に応答しなくなる可能性があります。
代わりに、非同期メソッドを使用してバックグラウンドでファイルをダウンロードできます。この場合、ダウンロード関数はすぐに戻り、プログラムの実行は正常に続行されます。すべてのダウンロード操作はバックグラウンドで行われ、完了するとプログラムに通知されます。
同期とは基本的に、一度に 1 つのことしか実行できないことを意味します。非同期とは、一度に複数の処理を実行でき、次の処理に進むために現在の処理を完了する必要がないことを意味します。
a>b>c>d> のようなシーケンスを実行するとき、実行の途中で次のような失敗が発生した場合:
a
b
c
fail
次に、最初からやり直します。
a
b
c
d
これは同期です
ただし、実行するシーケンスが同じ a>b>c>d> で、途中で失敗した場合:
a
b
c
fail
...しかし、最初からやり直すのではなく、失敗した時点からやり直します。
c
d
...これは非同期として知られています。
同期と並列と直列を混同しています。同期とは、すべて同時に意味します。同期化されたとは、互いに関連していることを意味します。これは、直列または一定の間隔で意味する場合があります。プログラムがすべてを実行している間、それは連続して実行されます。辞書を入手してください...これが私たちが甘くないお茶を飲む理由です。あなたはお茶か甘くしたお茶を持っています。
同期操作は、呼び出し元に戻る前にその作業を行います。
非同期操作は、呼び出し元に戻った後にその作業 (ほとんどまたはすべて) を行います。
同期実行の"同時に" の定義 (混乱を招くこともあります) については、次のように理解することをお勧めします。
同期実行:コード ブロック内のすべてのタスクがすべて同時に実行されます。
非同期実行:コード ブロック内のすべてのタスクが同時に実行されるわけではありません。