Pergunta

Quais bibliotecas existem para outras linguagens de programação para fornecer um modelo de simultaneidade no estilo Erlang (processos, caixas de correio, recebimento de correspondência de padrões, etc.)?

Observação:Estou especificamente interessado em coisas que pretendem ser semelhantes ao Erlang, não apenas em qualquer biblioteca de threading ou enfileiramento.

Foi útil?

Solução

Interface de passagem de mensagens (MPI) (http://www-unix.mcs.anl.gov/mpi/) é uma biblioteca altamente escalável e robusta para programação paralela, voltada originalmente para C, mas agora disponível em vários sabores http://en.wikipedia.org/wiki/Message_Passing_Interface#Implementations.Embora a biblioteca não introduza nova sintaxe, ela fornece um protocolo de comunicação para orquestrar o compartilhamento de dados entre rotinas que são paralelizáveis.

Tradicionalmente, ela é usada em grandes clusters de computação, em vez de em um único sistema para simultaneidade, embora sistemas multinúcleo certamente possam tirar vantagem dessa biblioteca.

Outra solução interessante para o problema da programação paralela é o OpenMP, que é uma tentativa de fornecer uma extensão portátil em várias plataformas para fornecer dicas ao compilador sobre quais seções de código são facilmente paralelizáveis.

Por exemplo (http://en.wikipedia.org/wiki/OpenMP#Work-sharing_constructs):

#define N 100000
int main(int argc, char *argv[])
{
  int i, a[N];
  #pragma omp parallel for
  for (i=0;i<N;i++) 
     a[i]= 2*i;
  return 0;
}

Existem vantagens e desvantagens em ambos, é claro, mas o primeiro provou ser extremamente bem-sucedido na academia e em outras aplicações de computação científica pesada.YMMV.

Outras dicas

Ulf Wiger tive uma ótima postagem recentemente sobre esse tópico - aqui estão as propriedades que ele define como necessárias antes que você possa chamar algo de "Simultaneidade de estilo Erlang":

  • Criação/destruição rápida de processos
  • Capacidade de suportar >> 10.000 processos simultâneos com características praticamente inalteradas.
  • Passagem rápida de mensagens assíncronas.
  • Copiando a semântica de passagem de mensagens (simultaneidade sem compartilhamento).
  • Monitoramento de processos.
  • Recepção seletiva de mensagens.

O número 2 acima é o mais difícil de suportar em VMs e implementações de linguagem que não foram inicialmente projetadas para simultaneidade.Isso não é para derrubar implementações de simultaneidade Erlang em outras linguagens, mas muito do valor de Erlang vem da capacidade de criar milhões de processos, o que é muito difícil se a abstração do processo tiver um relacionamento 1-1 com um thread ou processo no nível do sistema operacional.Ulf tem muito mais sobre isso no link acima.

Scala apoia atores.Mas eu não chamaria scala de intencionalmente semelhante a Erlang.

Mesmo assim, vale a pena dar uma olhada em scala!

Microsoft Tempo de execução de simultaneidade e coordenação para .NET.

O CCR é apropriado para um modelo de aplicativo que separa componentes em pedaços que podem interagir apenas através de mensagens.Os componentes deste modelo precisam de coordenar entre mensagens, lidar com cenários complexos de falha e lidar efetivamente com a programação assíncrona.

Também quilim é uma biblioteca para java, que traz passagem/atores de mensagens no estilo erlang para a linguagem Java.

Mike Rettig criou uma biblioteca .NET chamada Retlang e uma porta Java chamada Jetlang que é inspirada no modelo de simultaneidade de Erlang.

Resposta não pronta para produção da Microsoft para Erlang: Microsoft Axum

Para python você pode tentar usar módulo de processamento.

Cupim para o esquema Gambit.

Se você estiver usando Ruby, dê uma olhada no Revactor:[http://revactor.org/][1]

Revactor é uma implementação de modelo de ator para Ruby 1.9 construída sobre a biblioteca de eventos de alto desempenho Rev.O Revactor foi projetado principalmente para escrever serviços e ferramentas de rede do tipo Erlang.

Dê uma olhada neste exemplo de código:

  myactor = Actor.spawn do
    Actor.receive do |filter|
      filter.when(:dog) { puts "I got a dog!" }
    end
  end

Revactor só roda em Ruby 1.9.Acredito que o autor da biblioteca tenha interrompido a manutenção dela, mas a documentação em seu site é muito boa.

Você também pode querer dar uma olhada em Reia:uma linguagem de script semelhante a Ruby construída sobre a VM Erlang.Reia é o novo projeto do criador do Revactor:Tony Arcieri.

Aviso:ficha sem vergonha!

Desenvolvi uma biblioteca para esse tipo de passagem de mensagem em Haskell:Haskell distribuído estilo Erlang.

Volker

JoCaml estende OCaml com cálculo de junção para programação simultânea e distribuída.

Acá (http://akka.io) é fortemente influenciado pelo OTP de Erlangs.Ele foi desenvolvido com base nos atores do scala e é ótimo para simultaneidade na JVM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top