Programación concurrente de Erlang y Go, ¿diferencias objetivas entre CSP y actores?

19

Estaba buscando programación concurrente en los lenguajes de programación Erlang and Go. Según mi hallazgo, se utilizan modelo de actor y CSP respectivamente.

Pero todavía estoy confundido con cuáles son las diferencias objetivas entre CSP y actores. ¿Es solo teóricamente diferente pero el mismo concepto?

nish1013
fuente
Bueno, no son lo mismo, ya que Go proporciona un conjunto diferente de primitivas que Erlang. Además, Go tiene un nivel mucho más bajo que Erlang y C-like.
Daniel Gratzer
Las preguntas sobre qué lenguaje, tecnología o proyecto se debe abordar a continuación están fuera de tema en los Programadores, ya que solo pueden atraer opiniones subjetivas para obtener respuestas. Hay demasiados factores individuales detrás de la pregunta para crear respuestas que tendrán un valor duradero. Lectura recomendada: Gorilla vs Shark
mosquito
3
@gnat No estoy de acuerdo, esto es preguntar sobre las diferencias objetivas entre CSP y actores. Esa es una pregunta perfectamente razonable
Daniel Gratzer el
2
La pregunta no es acerca de lo bueno o lo malo, sino de lo diferente por determinar, por lo tanto, esta pregunta es concreta y no es motivo de debate subjetivo.
nish1013
1
Hay una muy buena respuesta a esta pregunta en el CS Theory StackExchange: ¿Cuál es la diferencia entre el Modelo de concurrencia del actor y los procesos secuenciales de comunicación
Jörg W Mittag

Respuestas:

21

En la práctica, hay muy poca diferencia: ambos representan unidades de ejecución separadas cuya interfaz principal con el mundo exterior es a través de mensajes.

Las diferencias están en los detalles de implementación de los idiomas. Aquí hay algunos detalles:

  • Los canales en Go están escritos; Si desea enviar mensajes con datos diferentes, necesita canales separados. Con Erlang, uno receiverecibe todo lo que se envía al proceso y debe coincidir con el patrón (en Go, usaría un selectcon múltiples casos, por lo que el código se vería muy similar, solo con diferentes canales).
  • Cualquiera puede leer o escribir un canal Go. En Erlang, cualquiera puede enviar a un proceso, pero solo ese proceso recibirá. Esto se vuelve importante si desea dividir una tarea entre varios trabajadores: en Erlang necesita crear un proceso de distribución, mientras que Go simplemente puede compartir un canal.
  • Erlang proporciona una ruta (en su mayoría) transparente para distribuir procesos en múltiples hosts / VM. Las goroutinas se limitan a un solo proceso (aunque hay bibliotecas para distribución).
  • El manejo de errores es muy diferente. Erlang trata cada proceso como independiente: un error en un proceso (por ejemplo, dividir por 0) no afectará a ningún otro proceso a menos que los vincules explícitamente (aunque algo esperando un mensaje del proceso inactivo se bloqueará). Las goroutinas se ejecutan todas en el mismo espacio de proceso; un divide por 0 eliminará todo el programa.
  • En Erlang, los datos son inmutables. Esto significa que toda comunicación entre un proceso y el mundo exterior se realiza a través de mensajes. Go te permite compartir el estado entre goroutines (aunque no deberías).

Este último punto es, creo, el más importante. Si bien ambos usan los mensajes como el medio principal de comunicación, Erlang ofrece garantías mucho más fuertes sobre cómo y cuándo puede cambiar el estado.

kdgregory
fuente