Erlang and Go gleichzeitige Programmierung, objektive Unterschiede zwischen CSP und Akteuren?

19

Ich beschäftigte mich mit gleichzeitiger Programmierung in den Programmiersprachen Erlang und Go. Nach meinem Befund werden sie als Actor Model bzw. CSP verwendet.

Trotzdem bin ich verwirrt mit den objektiven Unterschieden zwischen CSP und Akteuren. ist es nur theoretisch anders, aber das gleiche Konzept?

nish1013
quelle
Nun, sie sind nicht die gleichen, da Go eine andere Menge von Primitiven als Erlang bietet. Außerdem ist Go viel niedriger als Erlang und C-like.
Daniel Gratzer
Fragen, mit welcher Sprache, Technologie oder welchem ​​Projekt man sich als Nächstes befassen sollte, sind für Programmierer nicht relevant, da sie nur subjektive Meinungen für Antworten anziehen können. Hinter der Frage stehen zu viele Einzelfaktoren, um Antworten von bleibendem Wert zu finden. Literaturempfehlung: Gorilla vs Shark
Mücke
3
@gnat Ich stimme nicht zu, dies fragt nach den objektiven Unterschieden zwischen CSP und Akteuren. Das ist eine durchaus vernünftige Frage
Daniel Gratzer
2
Die Frage betrifft nicht gut oder schlecht, sondern die zu bestimmenden Unterschiede, daher ist diese Frage konkret und kein Grund zur subjektiven Debatte.
nish1013
1
Auf diese Frage gibt es im CS Theory StackExchange eine sehr schöne Antwort: Was ist der Unterschied zwischen dem Akteurmodell der Parallelität und der Kommunikation sequentieller Prozesse
Jörg W Mittag

Antworten:

21

In der Praxis gibt es kaum einen Unterschied: Beide stellen separate Ausführungseinheiten dar, deren primäre Schnittstelle zur Außenwelt über Nachrichten erfolgt.

Die Unterschiede liegen in den Implementierungsdetails der Sprachen. Hier sind einige solche Details:

  • Kanäle in Go werden eingegeben. Wenn Sie Nachrichten mit unterschiedlichen Daten senden möchten, benötigen Sie separate Kanäle. Mit Erlang receiveerhält man alles , was an den Prozess gesendet wird, und muss das Muster abgleichen (in Go würden Sie a selectmit mehreren Fällen verwenden, damit der Code sehr ähnlich aussieht, nur mit verschiedenen Kanälen).
  • Jeder kann einen Go-Kanal lesen oder schreiben. In Erlang kann jeder an einen Prozess senden, aber nur dieser Prozess wird empfangen. Dies ist wichtig, wenn Sie eine Aufgabe auf mehrere Mitarbeiter aufteilen möchten: In Erlang müssen Sie einen Verteilungsprozess erstellen, während Go einfach einen Kanal freigeben kann.
  • Erlang bietet einen (größtenteils) transparenten Pfad für die Verteilung von Prozessen auf mehrere Hosts / VMs. Goroutinen sind auf einen einzigen Prozess beschränkt (obwohl es Bibliotheken für die Verteilung gibt).
  • Die Fehlerbehandlung ist sehr unterschiedlich. Erlang behandelt jeden Prozess als unabhängig: Ein Fehler in einem Prozess (beispielsweise durch 0 teilen) wirkt sich nur dann auf andere Prozesse aus, wenn Sie sie explizit verknüpfen (obwohl etwas, das auf eine Nachricht vom toten Prozess wartet, hängen bleibt). Goroutinen laufen alle im selben Prozessraum; Eine Division durch 0 führt zum Herunterfahren des gesamten Programms.
  • In Erlang sind Daten unveränderlich. Dies bedeutet, dass die gesamte Kommunikation zwischen einem Prozess und der Außenwelt über Nachrichten erfolgt. Mit Go können Sie den Status zwischen Goroutinen teilen (obwohl Sie dies nicht sollten).

Dieser letzte Punkt ist meiner Meinung nach der wichtigste. Während beide Nachrichten als primäres Kommunikationsmittel verwenden, gibt Erlang viel stärkere Garantien darüber, wie und wann sich der Zustand ändern kann.

kdgregory
quelle