多くのプラットフォームは、応答性を向上させる手段として非同期性と並列性を促進します。私は一般的に違いを理解していますが、多くの場合、他の人と同様に自分の心の中で明確に表現することは難しいと感じています。
私は仕事のプログラマーで、かなり頻繁に非同期とコールバックを使用しています。並列処理はエキゾチックです。
しかし、特に言語設計レベルでは、それらは簡単に混同されるように感じます。それらがどのように関連しているか(または関連していないか)の明確な説明と、それぞれが最適に適用されるプログラムのクラスが必要です。
非同期で何かを実行するということは、それが非ブロッキングであることを意味し、完了するのを待たずに実行し、他のことを続けます。並列処理とは、複数の処理を同時に並行して実行することです。タスクを独立した作業に分離できる場合、並列処理はうまく機能します。
たとえば、3Dアニメーションのフレームをレンダリングします。アニメーションのレンダリングには時間がかかるため、アニメーション編集ソフトウェア内からそのレンダリングを起動する場合は、実行されていることを確認してください非同期 UIをロックせずに続行できます他のことをしています。現在、そのアニメーションの各フレームは個別のタスクと見なすこともできます。複数のCPU /コアまたは複数のマシンを使用できる場合は、複数のフレームをparallelでレンダリングして、全体的なワークロードを高速化できます。
主な違いは、並行処理と並行処理の違いだと思います。
非同期およびコールバックは、一般に、並行性、つまり、おそらく互いに通信してリソースを共有するエンティティのセットを表現する方法(ツールまたはメカニズム)です。非同期またはコールバックの場合、通信は暗黙的ですが、リソースの共有はオプションです(リモートマシンで結果が計算されるRMIを考慮してください)。正しく指摘されているように、これは通常、応答性を考慮して行われます。長いレイテンシーイベントを待たない。
並列プログラミングは通常、スループットを主な目的としていますが、レイテンシ、つまり単一要素の完了時間は、同等の順次プログラムよりも悪い場合があります。
並行性と並列性の違いをよりよく理解するために、ダニエル・ヴァラッカの並行性の確率モデルから引用します。
計算モデルは、システムが独立した自律的なコンポーネントで構成され、おそらく相互に通信することを表すことができる場合の並行性のモデルです。 並行性の概念と並列性の概念を混同しないでください。通常、並列計算には、複数のプロセッサ間で作業を分散する中央制御が含まれます。並行性では、コンポーネントの独立性と、互いに。並列性は古代エジプトのようなもので、ファラオが決定し、奴隷が働きます。同時実行性は現代のイタリアのようなもので、誰もが望むことを行い、すべて携帯電話を使用します。
結論、並列プログラミングは並行性の特殊なケースであり、個別のエンティティが連携して高いパフォーマンスとスループット(一般的に)を実現します。
非同期とコールバックは、プログラマーが並行性を表現できるようにするメカニズムにすぎません。 master/workerやmap/reduceなどのよく知られた並列プログラミング設計パターンは、より複雑なcentralized相互作用を実装するためにこのような低レベルのメカニズム(非同期)を使用するフレームワークによって実装されることを考慮してください。
この記事では非常によく説明しています: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming
非同期プログラミングについてこれがあります:
非同期呼び出しは、アプリケーション内の「ブロッキング」を防ぐために使用されます。 [このような]呼び出しは、既存のスレッド(I/Oスレッドなど)でスピンオフし、可能なときにタスクを実行します。
並列プログラミングに関するこれ:
並列プログラミングでは、作業またはタスクを分割しますが、主な違いは、作業の各チャンクに対して新しいスレッドをスピンアップすることです
そしてこれは要約すると:
非同期呼び出しが使用されますシステムで既に使用されているスレッドおよび並列プログラミングが必要です開発者が作業を分割、スピンアップ、必要な分解スレッド。
私の基本的な理解は:
非同期プログラミングは、他の操作を行う前に、高価な操作が完了するのを待つ問題を解決します。操作の完了を待っている間に他の作業を完了できる場合、それは良いことです。例:移動中にUIを実行し続け、Webサービスからより多くのデータを取得します。
並列プログラミングは関連していますが、大きなタスクを同時に計算できる小さなチャンクに分割することに関心があります。小さいチャンクの結果を組み合わせて、全体の結果を生成できます。例:個々のピクセルの色が本質的に独立しているレイトレーシング。
おそらくそれよりも複雑ですが、それが基本的な違いだと思います。
私はこれらの用語の違いを考える傾向があります:
非同期:終了したらこのタスクを実行し、戻ってきて、結果を知らせてください。それまでの間、他のことをやっていきます。
パラレル:このタスクを実行してほしい。それが簡単になったら、何人かの人々を助けてください。これは緊急ですが、結果が返ってくるまでここで待ちます。あなたが戻ってくるまで私は他に何もできません。
もちろん、非同期タスクは並列処理を利用するかもしれませんが、少なくとも私の考えでは、操作の実行中に他のことに取り組むか、結果が出るまですべてを完全に停止するかによって違いが異なります。
それは実行の順序の問題です。
AがBと非同期である場合、AのサブパートがBのサブパートに関していつ発生するかを事前に予測することはできません。
AがBと並行している場合、Aの事象はBの事象と同時に起こっています。しかし、実行順序はまだ定義されている可能性があります。
おそらく困難なのは、Wordの非同期が曖昧であることです。
執事にワインとチーズを求めて店に走るように言ったときに非同期タスクを実行し、彼のことを忘れて、彼が再び勉強のドアをたたくまで私の小説に取り組んでいます。ここでは並列処理が行われていますが、執事と私は根本的に異なるタスクと異なる社会階級の仕事に従事しているため、ここではそのラベルを適用しません。
私のメイドのチームは、それぞれが別の窓を洗っているときに並行して働いています。
私のレースカーサポートチームは非同期に並行しており、各チームは異なるタイヤで作業し、仕事中に互いに通信したり、共有リソースを管理したりする必要はありません。
私のサッカー(別名サッカー)チームは、各プレイヤーがフィールドに関する情報を独立して処理し、その上を動き回るのと並行して作業を行いますが、他のユーザーの通信に応答して応答する必要があるため、完全に非同期ではありません。
私のマーチングバンドは、各プレイヤーが音楽を読んで楽器を制御するため、並行していますが、非常に同期しています。つまり、お互いに時間をかけてプレイし、行進します。
カム付きガトリングガンは並列と見なすことができますが、すべてが100%同期しているため、1つのプロセスが前進しているようです。
なぜ非同期?
今日のアプリケーションはますます接続され、ネットワークI/Oやデータベース操作などの潜在的に長時間実行されるタスクやブロック操作を成長させているため、これらの操作をバックグラウンドで開始してユーザーインターフェイスに戻ることにより、これらの操作の遅延を隠すことが非常に重要ですできるだけ早く。ここでは、非同期が登場します応答性。
なぜ並列プログラミング?
今日のデータセットはより大きくなり、計算はより複雑になります。そのため、この場合、ワークロードをチャンクに分割し、それらのチャンクを同時に実行することにより、これらのCPUバウンド操作の実行時間を短縮することが非常に重要です。これを「Parallel」と呼ぶことができます。明らかに、アプリケーションに高いパフォーマンスを与えますPerformance.
非同期:ブロックせずにバックグラウンドでメソッドまたはタスクを実行します。必ずしも別のスレッドで実行されるとは限りません。コンテキストスイッチング/時間スケジューリングを使用します。
並列タスク:各タスクは並列で実行されます。コンテキスト切り替え/時間スケジューリングを使用しません。
私はここで2つの概念にかなり満足していますが、それらについて私にははっきりしないことがあります。
いくつかの答えを読んだ後、違いを説明するための正確で役立つメタファーがあると思います。
コードの個々の行を別々の、しかし順序付けられたトランプと考えるなら(古い学校のパンチカードがどのように機能するかを説明しているなら止めてください)、書かれた個々の手順ごとに、ユニークなカードのスタックがあります(しないでください)コピー&ペースト!)そして、通常のコードと非同期でコードを実行した場合の通常の動作の違いは、気にするかどうかによって異なります。
コードを実行すると、OSに一連の単一の操作(コンパイラーまたはインタープリターが「上位」レベルのコードを壊した)を渡して、プロセッサーに渡されます。 1つのプロセッサでは、一度に実行できるコードは1行のみです。したがって、複数のプロセスを同時に実行する錯覚を達成するために、OSは、一度に特定のプロセスから数行だけをプロセッサに送信し、表示方法に応じてすべてのプロセスを切り替えるという手法を使用します。フィット。その結果、複数のプロセスが同時に同じように見えるエンドユーザーに進捗を示します。
私たちの比phorでは、OSがカードをプロセッサに送る前に常にシャッフルするという関係があります。カードのスタックが別のスタックに依存していない場合、別のスタックがアクティブになったときにスタックの選択が停止したことに気付かないでしょう。あなたが気にしないのであれば、それは問題ではありません。
ただし、気にする場合(たとえば、複数のプロセス(またはカードのスタック)が互いに依存している場合)、OSのシャッフルは結果を台無しにします。
非同期コードを作成するには、その順序が最終的に何であるかに関係なく、実行順序間の依存関係を処理する必要があります。これが「コールバック」のような構造が使用される理由です。彼らはプロセッサに、「次にやるべきことは、他のスタックに何をしたかを伝えることだ」と言う。このようなツールを使用することにより、OSがそれ以上の命令を実行することを許可する前に、他のスタックに通知されることを保証できます。 (「If called_back == false:send(no_operation)」-これが実際に実装されているかどうかはわかりませんが、論理的には一貫していると思います。)
並列プロセスの場合の違いは、お互いを気にしない2つのスタックと、それらを処理する2つのワーカーがあることです。 1日の終わりに、2つのスタックからの結果を結合する必要がある場合があります。これは同期性の問題になりますが、実行するために再度気にする必要はありません。
これが役立つかどうかはわかりませんが、私は常に複数の説明が役立つと思います。また、非同期実行は個々のコンピューターとそのプロセッサーに制限されないことに注意してください。一般的に言えば、時間、または(さらに一般的に言えば)イベントの順序を扱います。したがって、依存スタックAをネットワークノードXに送信し、その結合スタックBをYに送信する場合、正しい非同期コードは、ラップトップでローカルに実行されているかのように状況を説明できるはずです。
非同期クライアントの連絡先であり、応答する必要があるとしましょう。つまり、ステータス、操作の複雑さ、必要なリソースなどを求められるたびに共有する必要があります。これで、時間のかかる操作を実行できるようになりました。したがって、クライアントに24時間年中無休で応答する必要があるため、これを処理できません。したがって、時間のかかる操作を他の人に委任して、応答できるようにします。これは非同期です。
並列プログラミングたとえば、テキストファイルから100行を読み取るタスクがあり、1行の読み取りに1秒かかるとします。したがって、テキストファイルの読み取りには100秒かかります。ここで、クライアントは操作が完了するまで100秒待つ必要があると心配しています。したがって、さらに9つのクローンを作成し、各クローンにテキストファイルから10行を読み取らせます。これで、100行を読み取るのにかかる時間はわずか10秒です。したがって、パフォーマンスが向上します。
要約すると、応答性を達成するために非同期コーディングが行われ、パフォーマンスのために並列プログラミングが行われます。
通常、毎回複数のことを実行できる方法は2つしかありません。 1つは非同期、もう1つは並列です。
高レベルから、人気のあるサーバー[〜#〜] nginx [〜#〜]および有名なPythonライブラリTornadoのように、両方とも完全にシングルスレッドサーバーである非同期パラダイムを利用して、数千のクライアントに同時にサービスを提供できます(一部のIOloopおよびcallback)。非同期プログラミングパラダイムを実装できる[〜#〜] ecf [〜#〜](exception control follow)を使用します。そのため、非同期では実際に同時処理が実行されない場合がありますが、一部のioバインドされた作業では、非同期が実際にパフォーマンスを向上させる可能性があります。
parallelパラダイムは、常にマルチスレッドとマルチプロセッシングを指します。これにより、マルチコアプロセッサを完全に利用でき、本当に同時に処理を実行できます。