2008-08-22 13 views
19

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

Nota: Estoy especialmente interesado en cosas que tienen la intención de ser similares a Erlang, no en cualquier biblioteca de subprocesos o colas.

+0

La principal dificultad aquí es que, si bien puede recibir mensajes en otros idiomas, es extremadamente difícil imitar el uso de grandes cantidades de procesos por parte de Erlang. Los procesos de desove en Erlang son similares a crear instancias de objetos en Java o Python: no pienses en ello. Si hace esto en el nivel del sistema operativo, se le acabarán rápidamente los recursos, lo que significa que no solo se trata de pasar mensajes, sino también de agruparlos, lo que se debe trabajar en la arquitectura. La máquina virtual de Erlang es un poco difícil de seguir en este sentido. Por supuesto, no todos los problemas necesitan millones de procesos simultáneos. – zxq9

Respuesta

7

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

Tradicionalmente, se usa en la computación en clúster grande en lugar de en un solo sistema para la concurrencia, aunque los sistemas multi-core 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 pistas 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; 
} 

Hay ventajas y desventajas de ambos, por supuesto, pero el primero ha demostrado ser un gran éxito en el mundo académico y otras aplicaciones de computación científica pesados. YMMV.

6

Microsoft Concurrency and Coordination Runtime para .NET.

El CCR es apropiado para un modelo aplicación que separa componentes en trozos que pueden interactuar sólo a través de mensajes. Los componentes de este modelo necesitan medios para coordinar los mensajes, ocuparse de escenarios de falla complejos, y ocuparse eficazmente de la programación asincrónica .

7

Scala admite actores. Pero no llamaría scala intencionalmente similar a Erlang.

No obstante, vale la pena echar un vistazo a scala.

6

También kilim es una biblioteca para java, que trae el mensaje de estilo erlang pasando/actores al lenguaje Java.

5

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

14

Ulf Wiger tenían un gran puesto recientemente en este tema - aquí son las propiedades que se definen como sea necesario antes de poder llamar a algo "Erlang Estilo de concurrencia":

  • proceso de rápida creación/destrucción
  • capacidad de soportar >> 10 000 procesos simultáneos con características casi sin cambios.
  • Transmisión rápida de mensajes asíncronos.
  • Copiando la semántica de paso de mensajes (concurrencia de compartir-nada).
  • Monitoreo de procesos.
  • Recepción selectiva de mensajes.

El número 2 anterior es el más difícil de admitir en las máquinas virtuales y las implementaciones de lenguaje que inicialmente no se diseñaron para concurrencia. Esto no es para noquear las implementaciones de concurrencia de Erlang-ish en otros lenguajes, pero gran parte del valor de Erlang proviene de la 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 sistema operativo nivel de hilo o proceso. Ulf tiene mucho más sobre esto en el enlace de arriba.

3

Si está usando Ruby, echar un vistazo a Revactor: [http://revactor.org/][1]

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

Tome 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 

Revactor 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.

También es posible que desee echar un vistazo a Reia: un lenguaje de scripting ruby-like construido sobre la máquina virtual de Erlang. Reia es el nuevo proyecto del creador de Revactor: Tony Arcieri.

2

JoCaml extiende OCaml con unirse cálculo para la programación concurrente y distribuida.

1

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

Cuestiones relacionadas