web-dev-qa-db-ja.com

ErlangとGoの並行プログラミング、CSPとアクターの客観的な違い?

ErlangとGoプログラミング言語での並行プログラミングについて調べていました。私の発見によると、それらはそれぞれアクターモデルとCSPを使用しています。

しかし、それでもCSPとアクターの客観的な違いは何ですか?それは単なる理論的な違いだけですか、同じ概念ですか?

19
nish1013

実際には、ほとんど違いはありません。どちらもprimaryが外部の世界とのインターフェースがメッセージを介している個別の実行単位を表しています。

違いは、言語の実装の詳細にあります。以下にそのような詳細をいくつか示します。

  • Goのチャネルは入力されます。異なるデータを含むメッセージを送信する場合は、個別のチャネルが必要です。 Erlangでは、1つのreceiveがすべてをプロセスに送信し、パターンマッチングを行う必要があります(Goでは、複数のケースでselectを使用するため、コードは非常に似ていますが、チャネル)。
  • 誰でもGoチャネルを読み書きできます。 Erlangでは、誰でもプロセスに送信できますが、そのプロセスのみが受信します。これは、複数のワーカー間でタスクを分割する場合に重要になります。Erlangでは、配布プロセスを作成する必要がありますが、Goは単にチャネルを共有できます。
  • Erlangは、複数のホスト/ VMにプロセスを分散するための(ほとんど)透過的なパスを提供します。ゴルーチンは単一のプロセスに限定されます(ただし、配布用のライブラリはあります)。
  • エラー処理は大きく異なります。 Erlangは各プロセスを独立したものとして扱います。1つのプロセスでのエラー(たとえば、divide-by-0)は、明示的にリンクしない限り、他のプロセスには影響しません(ただし、デッドプロセスからのメッセージを待機しているものはハングします)。ゴルーチンはすべて同じプロセス空間で実行されます。 divide-by-0はプログラム全体を停止します。
  • Erlangでは、データは不変です。これは、プロセスと外部の世界との間のall通信がメッセージを通じて行われることを意味します。 Goを使用すると、goroutine間で状態を共有できます(共有することはできません)。

この最後のポイントは、私が思うに、最も重要です。どちらもprimaryの通信手段としてメッセージを使用しますが、Erlangは状態がいつどのように変化するかについてより強力な保証を行います。

21
kdgregory