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


19

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

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


GoはErlangとは異なるプリミティブのセットを提供するため、それらは同じではありません。さらに、GoはErlangやCライクよりもはるかに低いレベルです。
ダニエル・グラッツァー

次に取り上げるべき言語、技術、またはプロジェクトについての質問は、プログラマーにとってはトピックから外れています。なぜなら、彼らは回答に対して主観的な意見しか集められないからです。質問の背後にある個々の要因が多すぎるため、永続的な価値を持つ回答を作成できません。推奨読書:ゴリラ対シャーク
gnat

3
@gnat私は同意しません、これはCSPとアクターの客観的な違いについて尋ねています。それは完全に合理的な質問です
ダニエルグラッツァー

2
質問は良いか悪いかではなく、決定されるべき違いであるため、この質問は具体的であり、主観的な議論の原因ではありません。
nish1013

1
CS理論StackExchangeでこの質問への非常に素晴らしい答えがあります:同時実行性と通信を行う一連の処理の俳優モデルの違いは何ですか
イェルクWミッターク

回答:


21

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.