私は2つの概念についてはかなり快適にここに来ましたが、それらについて私にははっきりしないものがあります。
いくつかの回答を読んだ後、違いを説明するための正確で役立つメタファーがあると思います。
コードの個々の行を別々の順序付けられたトランプとして考える場合(私が古い学校のパンチカードがどのように機能するかを説明している場合は、私を止めてください)、書かれた個別の手順ごとに、一意のカードのスタックがあります(しないでください)コピー&ペースト!)と、コードを正常に非同期に実行したときに通常起こることの違いは、気にするかどうかによって異なります。
コードを実行すると、OSにプロセッサに渡される単一の操作のセット(コンパイラまたはインタープリタが「より高い」レベルのコードを分割したもの)を渡します。1つのプロセッサでは、一度に1行のコードしか実行できません。したがって、複数のプロセスを同時に実行しているような錯覚を実現するために、OSは、特定のプロセスから一度に数行だけをプロセッサに送信し、見え方に従ってすべてのプロセスを切り替えるという手法を使用します。フィット。その結果、複数のプロセスが同時に見えるようにエンドユーザーに進行状況を示します。
比喩では、OSは常にカードをシャッフルしてからプロセッサに送信するという関係にあります。カードのスタックが別のスタックに依存していない場合、別のスタックがアクティブになったときにスタックが選択されなくなったことに気付かないでしょう。したがって、気にしない場合は問題ではありません。
ただし、気をつければ(たとえば、複数のプロセスまたはカードのスタックがあり、互いに依存している場合)、OSのシャッフルによって結果が台無しになります。
非同期コードを作成するには、その順序が最終的に何であるかに関係なく、実行順序間の依存関係を処理する必要があります。これが、「コールバック」などの構造が使用される理由です。彼らはプロセッサに、「次にすべきことは、私たちが何をしたかを他のスタックに伝えることです」と言います。そのようなツールを使用することにより、OSがそれ以上の命令を実行することを許可する前に、他のスタックに通知が送られることが保証されます。( "called called_back == false:send(no_operation)"-これが実際にどのように実装されているかはわかりませんが、論理的には一貫していると思います。)
並列プロセスの場合の違いは、お互いを気にしない2つのスタックと、それらを処理する2つのワーカーがあることです。1日の終わりに、2つのスタックの結果を組み合わせる必要がある場合があります。これは、同時性の問題になりますが、実行する場合は、再び気にする必要はありません。
これが役立つかどうかはわかりませんが、常に複数の説明が役立つと思います。また、非同期実行は個々のコンピューターとそのプロセッサーに制限されないことに注意してください。一般的に言えば、それは時間、または(さらに一般的に言えば)イベントの順序を扱います。したがって、依存スタックAをネットワークノードXに送信し、その結合スタックBをYに送信する場合、正しい非同期コードは、ラップトップでローカルに実行されているかのように状況を説明できるはずです。