Programmazione concorrente Erlang and Go, differenze oggettive tra CSP e attori?


19

Stavo esaminando la programmazione concorrente nei linguaggi di programmazione Erlang e Go. Secondo la mia scoperta, vengono utilizzati rispettivamente modello di attore e CSP.

Ma sono ancora confuso con quali sono le differenze oggettive tra CSP e attori? è solo teoricamente diverso, ma lo stesso concetto?


Beh, non sono gli stessi poiché Go fornisce un set di primitive diverso da quello di Erlang. Inoltre, Go è molto più basso di Erlang e C-like.
Daniel Gratzer,

Le domande su quale lingua, tecnologia o progetto dovremmo prendere dopo sono fuori tema per i programmatori, in quanto possono solo attrarre opinioni soggettive per le risposte. Ci sono troppi singoli fattori alla base della domanda per creare risposte che avranno un valore duraturo. Letture consigliate: Gorilla vs Shark
moscerino

3
@gnat Non sono d'accordo, questo è chiedere delle differenze oggettive tra CSP e attori. Questa è una domanda perfettamente ragionevole
Daniel Gratzer,

2
La questione non riguarda il bene o il male, ma il diverso da determinare, quindi questa domanda è concreta e non causa di dibattito soggettivo.
nish1013

Risposte:


21

In pratica, la differenza è minima: entrambi rappresentano unità di esecuzione separate la cui interfaccia principale con il mondo esterno è tramite messaggi.

Le differenze sono nei dettagli di implementazione delle lingue. Ecco alcuni di questi dettagli:

  • I canali in Go vengono digitati; se si desidera inviare messaggi con dati diversi, è necessario disporre di canali separati. Con Erlang, si receiveottiene tutto ciò che viene inviato al processo e deve corrispondere al modello (in Go, si userebbe a selectcon più casi, quindi il codice sembrerebbe molto simile, solo con canali diversi).
  • Chiunque può leggere o scrivere un canale Go. A Erlang, chiunque può inviare a un processo, ma solo quel processo riceverà. Questo diventa importante se vuoi dividere un'attività tra più lavoratori: in Erlang devi creare un processo di distribuzione, mentre Go può semplicemente condividere un canale.
  • Erlang fornisce un percorso (principalmente) trasparente alla distribuzione dei processi su più host / VM. Le goroutine sono limitate a un singolo processo (anche se ci sono librerie per la distribuzione).
  • La gestione degli errori è molto diversa. Erlang considera ogni processo come indipendente: un errore in un processo (diciamo divide-per-0) non influirà su nessun altro processo a meno che tu non li colleghi esplicitamente (anche se qualcosa in attesa di un messaggio dal processo morto si bloccherà). Le goroutine funzionano tutte nello stesso spazio di processo; una divisione per 0 eliminerà l'intero programma.
  • In Erlang, i dati sono immutabili. Ciò significa che tutte le comunicazioni tra un processo e il mondo esterno avvengono attraverso i messaggi. Go ti consente di condividere lo stato tra goroutine (anche se non dovresti).

Quest'ultimo punto è, credo, il più importante. Mentre entrambi usano i messaggi come principale mezzo di comunicazione, Erlang offre garanzie molto più forti su come e quando lo stato può cambiare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.