Programmation simultanée Erlang and Go, différences objectives entre CSP et acteurs?

19

Je cherchais dans la programmation simultanée dans les langages de programmation Erlang and Go. Selon ma conclusion, ils sont utilisés respectivement modèle Acteur et CSP.

Mais je suis toujours confus avec quelles sont les différences objectives entre CSP et Acteurs? est-ce seulement théorique différent mais le même concept?

nish1013
la source
Eh bien, ce n'est pas la même chose, car Go fournit un ensemble de primitives différent d'Erlang. De plus, Go est un niveau beaucoup plus bas qu'Erlang et C-like.
Daniel Gratzer
Les questions sur le langage, la technologie ou le projet à aborder sont hors sujet sur les programmeurs, car elles ne peuvent qu'attirer des opinions subjectives pour les réponses. Il y a trop de facteurs individuels derrière la question pour créer des réponses qui auront une valeur durable. Lecture recommandée: Gorilla vs Shark
moucheron
3
@gnat Je ne suis pas d'accord, c'est une question sur les différences objectives entre CSP et Acteurs. C'est une question parfaitement raisonnable
Daniel Gratzer
2
La question ne concerne pas le bien ou le mal mais les différents à déterminer, donc cette question est concrète et ne fait pas l'objet d'un débat subjectif.
nish1013
1
Il y a une très bonne réponse à cette question sur le CS Theory StackExchange: Quelle est la différence entre le modèle d'acteur de la concurrence et la communication des processus séquentiels
Jörg W Mittag

Réponses:

21

En pratique, il y a très peu de différence: les deux représentent des unités d'exécution distinctes dont l' interface principale avec le monde extérieur se fait via des messages.

Les différences résident dans les détails d'implémentation des langues. Voici quelques détails de ce type:

  • Les chaînes de Go sont tapées; si vous souhaitez envoyer des messages avec des données différentes, vous avez besoin de canaux séparés. Avec Erlang, receivetout est envoyé au processus et doit correspondre au modèle (dans Go, vous utiliseriez un selectavec plusieurs cas, donc le code serait très similaire, juste avec différents canaux).
  • Tout le monde peut lire ou écrire une chaîne Go. À Erlang, n'importe qui peut envoyer à un processus, mais seul ce processus recevra. Cela devient important si vous souhaitez diviser une tâche entre plusieurs travailleurs: dans Erlang, vous devez créer un processus de distribution, tandis que Go peut simplement partager un canal.
  • Erlang fournit un chemin (principalement) transparent pour distribuer les processus sur plusieurs hôtes / VM. Les goroutines sont confinées à un seul processus (bien qu'il existe des bibliothèques pour la distribution).
  • La gestion des erreurs est très différente. Erlang traite chaque processus comme indépendant: une erreur dans un processus (disons diviser par 0) n'affectera aucun autre processus sauf si vous les liez explicitement (bien que quelque chose en attente d'un message du processus mort se bloque). Les goroutines fonctionnent toutes dans le même espace de processus; une division par 0 supprimera tout le programme.
  • À Erlang, les données sont immuables. Cela signifie que toute communication entre un processus et le monde extérieur passe par des messages. Go vous permet de partager l'état entre les goroutines (bien que vous ne devriez pas).

Ce dernier point est, je pense, le plus important. Alors que les deux utilisent les messages comme principal moyen de communication, Erlang offre des garanties beaucoup plus solides sur la manière et le moment où l'état peut changer.

kdgregory
la source