Programação simultânea Erlang e Go, diferenças objetivas entre CSP e atores?


19

Eu estava olhando para programação simultânea nas linguagens de programação Erlang e Go. De acordo com a minha descoberta, eles são usados ​​modelo de ator e CSP, respectivamente.

Mas ainda estou confuso com quais são as diferenças objetivas entre CSP e atores? é apenas apenas teórico diferente, mas o mesmo conceito?


Bem, eles não são os mesmos, já que o Go fornece um conjunto diferente de primitivos que o Erlang. Além disso, o Go é um nível muito mais baixo do que o Erlang e o C-like.
Daniel Gratzer #

Perguntas sobre qual idioma, tecnologia ou projeto se deve seguir em seguida estão fora de tópico para os programadores, pois eles só podem atrair opiniões subjetivas para obter respostas. Existem muitos fatores individuais por trás da pergunta para criar respostas que terão um valor duradouro. Leitura recomendada: Gorilla vs Shark
gnat

3
@gnat Eu discordo, isso está perguntando sobre as diferenças objetivas entre CSP e atores. Essa é uma pergunta perfeitamente razoável
Daniel Gratzer

2
A questão não é boa ou ruim, mas a diferente a ser determinada; portanto, essa questão é concreta e não é motivo de debate subjetivo.
Nish1013

1
Há um muito bom resposta a esta pergunta sobre o CS Teoria Stackexchange: Qual é a diferença entre o modelo do ator de Processos de simultaneidade e comunicar seqüenciais
Jörg W Mittag

Respostas:


21

Na prática, há muito pouca diferença: ambos representam unidades de execução separadas cuja interface principal com o mundo externo é via mensagens.

As diferenças estão nos detalhes de implementação dos idiomas. Aqui estão alguns desses detalhes:

  • Os canais no Go são digitados; se você quiser enviar mensagens com dados diferentes, precisará de canais separados. Com Erlang, é possível receiveobter tudo o que é enviado ao processo e deve corresponder aos padrões (no Go, você usaria a selectcom vários casos, para que o código parecesse muito semelhante, apenas com canais diferentes).
  • Qualquer pessoa pode ler ou escrever um canal Go. Em Erlang, qualquer pessoa pode enviar para um processo, mas somente esse processo será recebido. Isso se torna importante se você deseja dividir uma tarefa entre vários trabalhadores: em Erlang, você precisa criar um processo de distribuição, enquanto o Go pode simplesmente compartilhar um canal.
  • Erlang fornece um caminho (principalmente) transparente para a distribuição de processos em vários hosts / VMs. Goroutines estão confinadas a um único processo (embora existam bibliotecas para distribuição).
  • O tratamento de erros é muito diferente. Erlang trata cada processo como independente: um erro em um processo (digamos, dividir por 0) não afetará nenhum outro processo, a menos que você os vincule explicitamente (embora algo que esteja aguardando uma mensagem do processo morto seja interrompido). Todas as goroutines são executadas no mesmo espaço de processo; uma divisão por 0 derrubará todo o programa.
  • Em Erlang, os dados são imutáveis. Isso significa que toda a comunicação entre um processo e o mundo exterior ocorre por meio de mensagens. Go permite que você compartilhe o estado entre goroutines (embora não deva).

Este último ponto é, penso eu, o mais importante. Embora ambos usem as mensagens como principal meio de comunicação, Erlang oferece garantias muito mais fortes sobre como e quando o estado pode mudar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.