Pregunta

¿Qué bibliotecas existen para que otros lenguajes de programación proporcionen un modelo de concurrencia estilo Erlang (procesos, buzones de correo, recepción de coincidencia de patrones, etc.)?

Nota:Estoy específicamente interesado en cosas que pretenden ser similares a Erlang, no cualquier biblioteca de subprocesos o colas.

¿Fue útil?

Solución

Interfaz de paso de mensajes (MPI) (http://www-unix.mcs.anl.gov/mpi/) es una biblioteca robusta y altamente escalable para programación paralela, orientada originalmente a C pero ahora disponible en varias versiones. http://en.wikipedia.org/wiki/Message_Passing_Interface#Implementations.Si bien la biblioteca no introduce nueva sintaxis, proporciona un protocolo de comunicación para organizar el intercambio de datos entre rutinas que son paralelizables.

Tradicionalmente, se utiliza en computación de clústeres grandes en lugar de en un solo sistema para lograr concurrencia, aunque los sistemas de múltiples núcleos ciertamente pueden aprovechar esta biblioteca.

Otra solución interesante al problema de la programación paralela es OpenMP, que es un intento de proporcionar una extensión portátil en varias plataformas para proporcionar sugerencias al compilador sobre qué secciones de código son fácilmente paralelizables.

Por ejemplo (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;
}

Por supuesto, ambos tienen ventajas y desventajas, pero el primero ha demostrado ser extremadamente exitoso en el mundo académico y otras aplicaciones informáticas científicas importantes.YMMV.

Otros consejos

Ulf Wiger Tuve una excelente publicación recientemente sobre este tema: aquí están las propiedades que define como requeridas antes de poder llamar a algo "Simultaneidad de estilo Erlang":

  • Creación/destrucción rápida de procesos
  • Capacidad para soportar >> 10 000 procesos simultáneos con características prácticamente sin cambios.
  • Paso rápido de mensajes asincrónicos.
  • Copiar la semántica de paso de mensajes (simultaneidad sin compartir).
  • Seguimiento de procesos.
  • Recepción selectiva de mensajes.

El número 2 anterior es el más difícil de admitir en máquinas virtuales e implementaciones de lenguajes que no fueron diseñadas inicialmente para la concurrencia.Esto no pretende criticar las implementaciones de concurrencia estilo Erlang en otros lenguajes, pero gran parte del valor de Erlang proviene de su capacidad de crear millones de procesos, lo cual es bastante difícil si la abstracción del proceso tiene una relación 1-1 con un subproceso o proceso a nivel del sistema operativo.Ulf tiene mucho más sobre esto en el enlace de arriba.

Scala apoya a los actores.Pero no llamaría a Scala intencionalmente similar a Erlang.

¡Sin embargo, vale la pena echarle un vistazo a Scala!

microsoft Tiempo de ejecución de simultaneidad y coordinación para .NET.

El CCR es apropiado para un modelo de aplicación que separa los componentes en piezas que solo pueden interactuar a través de mensajes.Los componentes en este modelo necesitan medios para coordinar entre mensajes, tratar con escenarios de falla complejos y tratar efectivamente con la programación asincrónica.

También Kilim es una biblioteca para java, que trae actores/paso de mensajes estilo erlang al lenguaje Java.

Mike Rettig creó una biblioteca .NET llamada Retlang y un puerto de Java llamado Jetlang que está inspirado en el modelo de concurrencia de Erlang.

La respuesta de Microsoft a Erlang que no está lista para producción: Microsoft Axum

Para Python puedes intentar usar módulo de procesamiento.

Termita para el esquema Gambito.

Si estás usando Ruby, echa un vistazo a Reactor:[http://revactor.org/][1]

Revactor es una implementación del modelo Actor para Ruby 1.9 construida sobre la biblioteca de eventos de alto rendimiento Rev.Revactor está diseñado principalmente para escribir herramientas y servicios de red similares a Erlang.

Eche un vistazo a este ejemplo de código:

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

Reactor sólo se ejecuta en Ruby 1.9.Creo que el autor de la biblioteca ha dejado de mantenerla, pero la documentación en su sitio es muy buena.

Quizás también quieras echarle un vistazo a Reia:un lenguaje de secuencias de comandos similar a Ruby creado sobre Erlang VM.Reia es el nuevo proyecto del creador de Reactor:Tony Arcieri.

Advertencia:enchufe descarado!

Desarrollé una biblioteca para este tipo de transmisión de mensajes en Haskell:Haskell distribuido estilo Erlang.

Volker

jocaml extiende OCaml con cálculo de unión para programación concurrente y distribuida.

akká (http://akka.io) está fuertemente influenciado por la OTP de erlangs.Se ha basado en los actores de Scala y es excelente para la concurrencia en JVM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top