Pregunta

Esto puede ser una pregunta que otros han visto, pero estoy tratando de encontrar un lenguaje diseñado para (o con el soporte de idioma para) la programación concurrente que puede funcionar en la plataforma .NET.

he estado haciendo desarrollo lateral en Erlang para tener una idea de la lengua y han querido lo fácil que es conseguir un concurrente estables o incluso sistema distribuido hacia arriba. Me llevó a Scala, que también tenía un buen sistema utilizando actores, sin embargo no parece scala.net tener esta funcionalidad actualmente (Concedido este es un sistema concurrente frente a un sistema distribuido). Los dos lenguajes .NET que estaba mirando son Axum y F #.

¿Son estas las únicas opciones que tengo? ¿Hay otros? Y, si son las únicas opciones, ¿cuáles son las ventajas / desventajas de cada uno?

¿Fue útil?

Solución

Axum es un proyecto de investigación. Un real proyecto de investigación, en el que sólo las ideas de que va a terminar en los productos. (A diferencia de F #, que fue productizado en su conjunto.) Estoy ni siquiera seguro de la licencia permite utilizarlo para desarrollar aplicaciones de producción.

F # es una buena elección.

Clojure también se ejecuta en la CLI, y es una buena opción, también.

El puerto CLI de Scala se encuentra actualmente en proceso de ser resucitado (con officiall fondos de Microsoft, en realidad), y las bibliotecas Actor de Scala (tanto la incorporada en uno, así como Akka) son bastante buenos.

comentario con respecto a @ wmeyer de arriba: sí Scala no tiene ninguna disposición para la programación distribuida. (Tampoco Clojure.) Ambos se basan generalmente en la gran cantidad de marcos de Java que existen para tal fin, como terracota. Sin embargo, Akka hace Actores tener remotos para la programación distribuida, y es en gran parte Akka API-compatible con la biblioteca incorporada Actor Scala, lo que permite una transición sin problemas.

Erlang sería una especie de fresco. Kresten Krab Thorup está trabajando actualmente en Erjang, una implementación de Erlang en la JVM, y él tiene algunos resultados bastante impresionantes: se ejecuta en HotSpot, Erjang escalas comparable a la viga, a veces incluso mejor. Por ejemplo, en la (in) famoso punto de referencia tórica proceso con 10000 procesos, Erjang se pone en marcha sólo mínimamente más lento que BEAM, pero cuando se repiten los diversos tiempos de ejecución y las patadas JIT en, al sobrepasar HAZ después de 3 carreras (y curiosamente , BEAM comienza a empeorar después de 4 carreras).

Estoy bastante seguro de que podría construir un "#rlang" en el DLR y el TPL que realiza igualmente bien.

Otros consejos

De hecho, estoy usando F # para hacer las dos concurrentes y distribuidos programación en este momento. Creo que está funcionando muy bien. tipos de unión que sea fácil de definir mensajes de tipo estático. NET serialización es demasiado lento para nosotros, pero su sustitución por el uso de analizador personalizado y combinadores unparser fue fácil y el rendimiento es ahora lo suficientemente bueno. flujos de trabajo y los procesadores asíncronos buzón hacen que sea fácil para pasar mensajes con facilidad. La inferencia de tipos significa toda mi base de código es pequeño y fácil de mantener.

Creo que Jörg ya ha respondido a su pregunta acerca de Axum (y no sé mucho sobre él), por lo que voy a añadir un par de cosas acerca de F # - una cosa a tener en cuenta es que F # no es realmente una lenguaje concurrente. Sólo tiene buenas bibliotecas para hacer el desarrollo paralelo. Las opciones más notables son:

  • tarea paralela Biblioteca y PLINQ que están disponibles en C # también, pero puede verse un bonito poco en Fa #, especialmente si utiliza los tipos de datos inmutables. Hay algunos agradable F # ejemplos del uso de estos dos en Programación Paralela con .NET y yo escribimos un entrada de blog sobre la versión # F.

  • asíncrono flujos de trabajo no son esencialmente diseñado para la programación concurrente - que le permiten escribir código no bloqueante en general (que es bastante útil en la programación concurrente) y que le permiten escribir cálculos que se pueden iniciar y gestionar. Usted las puede utilizar para:

      el paralelismo basado en tareas
    • (un poco como tarea paralela Biblioteca) utilizando el método StartChild
    • cálculos de datos en paralelo utilizando Async.Parallel
      _
  • programación basada en agentes utilizando el tipo de MailboxProcessor F # permite el uso de la concurrencia de paso de mensajes que es bastante similar a Erlang. Se basa en flujos de trabajo asíncrono, lo que le otorga algunos beneficios (por ejemplo, a la espera de un mensaje es no bloqueante).

En resumen, creo que es más importante elegir el derecho paralelo modelo de programación para la tarea que el idioma Se utiliza para codificar - siempre y cuando el lenguaje da que el poder suficiente para codificar el modelo de programación. En este caso, el modelo de programación da forma a su mente más que el idioma. Axum se basa en el actor modelo (de paso de mensajes), así que creo que con un poco de esfuerzo, usted puede envolver F # agentes que mirar bastante similar a la API de Axum.

Desde .NET 4.5 se puede utilizar C # asíncrono / esperan. Traté de explicar un multi-hilo, actor de diseño basado en el uso de asíncrono / esperan. AsyncWcfLib está destinada a ayudar en la creación de sistemas concurrentes o distribuidos.

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