非同期実行と同期実行の違いは何ですか?
同期的に実行する場合は、そのタスクが終了するのを待ってから別のタスクに移ります。非同期に実行する場合は、終了する前に別のタスクに移ることができます。
スレッドとは、作業の単位として存在する一連のコマンド(コードの塊)のことです。オペレーティングシステムは、複数のスレッドを管理し、あるスレッドにプロセッサ時間を割り当ててから、別のスレッドに切り替えて仕事をさせることができます。プロセッサーは単純にコマンドを実行するだけで、同時に2つのことをするという概念はありません(失礼)。オペレーティングシステムは、異なるスレッドに時間のスライスを割り当てることでこれをシミュレートします。
ここで、複数のコア/プロセッサを導入すると、実際に同時に物事を行うことができるようになります。オペレーティングシステムは、最初のプロセッサ上のあるスレッドに時間を割り当てた後、別のプロセッサ上の別のスレッドに同じブロックの時間を割り当てることができます。 これらはすべて、タスクの完了をオペレーティングシステムが管理し、その間にあなたはコードを書き進めたり、他のことをしたりすることができるということです。
非同期プログラミングは、同時に行うことができる場合に、どのように物事が結びつくかというセマンティクスの問題があるため、複雑なテーマです。このテーマに関する記事や書籍は数多くありますので、ぜひご覧ください。
同期実行とは、一連の流れの中で実行されることを意味します。 A->B->C->Dのようになります。 これらのルーチンを呼び出している場合、
Aが実行されてから終了し、次に
Bが開始されてから終了し、次に
C`が開始されるといった具合です。
非同期実行**では、ルーチンを開始し、次のルーチンを開始する間、バックグラウンドで実行させ、ある時点で "wait for this to finish"とします。 といった感じになります。
Start A->B->C->D->
Wait for A
to finish
利点は、A
がまだ実行されている間に(バックグラウンドで、別のスレッドで)B
、C
、またはD
を実行できるので、リソースをより有効に活用でき、"hanggs"や"waits"が少なくて済むことです。
非同期実行とは、簡単に言えば、バックグラウンドで何かをすることです。
例えば、インターネットからファイルをダウンロードしたい場合、同期関数を使ってダウンロードすることができますが、ファイルのダウンロードが終わるまでスレッドがブロックされてしまいます。これでは、ユーザーの入力に反応しないアプリケーションになってしまいます。
代わりに、非同期メソッドを使ってバックグラウンドでファイルをダウンロードすることができます。この場合、ダウンロード関数はすぐに戻り、プログラムの実行は通常通り行われます。すべてのダウンロード操作はバックグラウンドで行われ、終了するとプログラムに通知されます。