Domanda

Quali librerie esistono per altri linguaggi di programmazione per fornire un modello di concorrenza in stile Erlang (processi, caselle di posta, ricezione con corrispondenza di modelli, ecc.)?

Nota:Sono particolarmente interessato a cose che dovrebbero essere simili a Erlang, non solo a qualsiasi libreria di threading o accodamento.

È stato utile?

Soluzione

Interfaccia di passaggio messaggi (MPI) (http://www-unix.mcs.anl.gov/mpi/) è una libreria altamente scalabile e robusta per la programmazione parallela, originariamente orientata al C ma ora disponibile in diverse versioni http://en.wikipedia.org/wiki/Message_Passing_Interface#Implementations.Sebbene la libreria non introduca una nuova sintassi, fornisce un protocollo di comunicazione per orchestrare la condivisione dei dati tra routine parallelizzabili.

Tradizionalmente viene utilizzata in cluster computing di grandi dimensioni piuttosto che su un singolo sistema per la concorrenza, sebbene i sistemi multi-core possano certamente trarre vantaggio da questa libreria.

Un'altra soluzione interessante al problema della programmazione parallela è OpenMP, che è un tentativo di fornire un'estensione portabile su varie piattaforme per fornire suggerimenti al compilatore su quali sezioni di codice siano facilmente parallelizzabili.

Per esempio (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;
}

Naturalmente entrambi presentano vantaggi e svantaggi, ma il primo ha dimostrato di avere un enorme successo nel mondo accademico e in altre applicazioni informatiche scientifiche pesanti.YMMV.

Altri suggerimenti

Ulf Wiger recentemente è stato pubblicato un ottimo post su questo argomento: ecco le proprietà che definisce come richieste prima di poter chiamare qualcosa "Concurrenza stile Erlang":

  • Creazione/distruzione rapida del processo
  • Capacità di supportare >> 10 000 processi simultanei con caratteristiche sostanzialmente invariate.
  • Passaggio veloce dei messaggi asincroni.
  • Copia della semantica di passaggio di messaggi (concorrenza senza condivisione di nulla).
  • Monitoraggio del processo.
  • Ricezione selettiva dei messaggi.

Il numero 2 riportato sopra è il più difficile da supportare nelle VM e nelle implementazioni del linguaggio che inizialmente non erano progettate per la concorrenza.Questo non vuol dire mettere in discussione le implementazioni di concorrenza stile Erlang in altri linguaggi, ma gran parte del valore di Erlang deriva dalla capacità di creare milioni di processi, il che è dannatamente difficile se l'astrazione del processo ha una relazione 1-1 con un thread o un processo a livello di sistema operativo.Ulf ha molto di più al riguardo nel link sopra.

La Scala sostiene gli attori.Ma non definirei Scala intenzionalmente simile a Erlang.

Tuttavia vale assolutamente la pena dare un'occhiata a Scala!

Microsoft Runtime di concorrenza e coordinamento per .NET.

Il CCR è appropriato per un modello di applicazione che separa i componenti in pezzi che possono interagire solo attraverso i messaggi.I componenti in questo modello devono essere mezzi per coordinarsi tra messaggi, affrontare scenari di fallimento complessi e gestire efficacemente la programmazione asincrona.

Anche Kilim è una libreria per Java, che porta il passaggio di messaggi/attori in stile erlang nel linguaggio Java.

Mike Rettig ha creato una libreria .NET chiamata Retlang e un port Java chiamato Jetlang che si ispira al modello di concorrenza di Erlang.

La risposta di Microsoft non pronta per la produzione a Erlang: Microsoft Axum

Per Python puoi provare a utilizzare modulo di elaborazione.

Termite per lo schema Gambit.

Se stai usando Ruby, dai un'occhiata a Revactor:[http://revactor.org/][1]

Revactor è un'implementazione del modello Actor per Ruby 1.9 costruita sulla libreria di eventi Rev ad alte prestazioni.Revactor è progettato principalmente per scrivere servizi e strumenti di rete simili a Erlang.

Dai un'occhiata a questo esempio di codice:

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

Revactor funziona solo su Ruby 1.9.Credo che l'autore della libreria abbia interrotto la sua manutenzione, ma la documentazione sul proprio sito è molto buona.

Potresti anche dare un'occhiata a Reia:un linguaggio di scripting simile al rubino costruito sulla Erlang VM.Reia è il nuovo progetto del creatore di Revactor:Tony Arcieri.

Avvertimento:spina spudorata!

Ho sviluppato una libreria per questo tipo di passaggio di messaggi in Haskell:Haskell distribuito in stile Erlang.

Volker

JoCaml estende OCaml con il join calcolo per la programmazione simultanea e distribuita.

Akka (http://akka.io) è fortemente influenzato dall'OTP di Erlangs.Si è basato sugli attori di Scala ed è ottimo per la concorrenza su JVM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top