2011-12-02 8 views
22

He leído muchos artículos sobre Haskell distribuido. Se ha hecho mucho trabajo, pero parece estar en el área de la distribución de cálculos. Vi el paquete remote que parece implementar el envío de mensajes al estilo Erlang, pero es 0.1 y etapa inicial.Distribuye Haskell estado de la técnica en 2011?

Me gustaría implementar un sistema donde hay muchos procesos separados que proporcionan servicios distintos, y están unidos por varios procesos principales. Esto parece ser un ajuste natural para Erlang, pero no así para Haskell. Pero me gusta la seguridad de tipo de Haskell.

¿Ha habido alguna adopción reciente de la gestión de procesos de estilo Erlang en Haskell?

+3

Como usted dice, parece ser un ajuste natural para Erlang - ¿no es ese el tipo de problema Erlang fue * diseñado * para? Me gusta mucho Haskell, pero esto suena como una muy clara "herramienta adecuada para el trabajo". ¿Por qué no usar Erlang? –

+4

Porque hay otras consideraciones además de la concurrencia, y creo que Haskell proporciona mejores beneficios en estas áreas. Lo que estoy buscando es una recomendación sobre cómo hacer mejor la concurrencia orientada a procesos en Haskell. – Ana

Respuesta

16

Si desea obtener más información sobre el paquete remote, a.k. un CloudHaskell, consulte the paper, así como thesis de Jeff Epstein. Su objetivo es proporcionar precisamente la abstracción del actor que desea, pero como usted dice, está en las primeras etapas. Existe una discusión activa con respecto a las mejoras en el parallel-haskell mailing list, por lo que si tiene necesidades específicas que remote no proporciona, estaremos encantados de que intervenga y nos ayude a decidir sus direcciones futuras.

Más maduro pero de menor nivel que remote es el paquete haskell-mpi. Si se atiene a la interfaz Simple, se pueden enviar mensajes que contengan instancias arbitrarias Serialize, pero la abstracción es aún mucho menor que remote.

Existen algunos sistemas experimentales, como los descritos en Implementación de un Haskell paralela de memoria distribuida de alto nivel en Haskell (Patrick Maier y Phil Trinder, IFL 2011, no se puede encontrar un pdf en línea). Combina un enfoque monad-par del paralelismo de flujo de datos determinístico con una capacidad limitada para hacer que las estructuras I puedan serializarse a través de la red. Este tipo de abstracción es prometedor para hacer cálculos distribuidos, pero dado que la atención se centra en el cálculo de valores puramente funcionales en lugar de proporcionar procesos al estilo de Erlang, probablemente no sean adecuados para su aplicación.

Además, para ser completo, debo señalar la página wiki de Haskell en cloud and HPC Haskell, que cubre lo que describo aquí, así como la subsección en distributed Haskell, que parece necesitar una actualización.

+3

La tesis y el documento para CloudHaskell usan mucha terminología y "palabras clave" (nombres de funciones, tipos de datos) que son diferentes del paquete CloudHaskell/remote. ¡Alguien que escriba una explicación/tutorial más actualizado sería * muy * útil! – amindfv

+1

Aparentemente CloudHaskell se está implementando de nuevo: https://github.com/haskell-distributed/distributed-process – balu

7

Frecuentemente tengo la sensación de que el IPC y los actores son una característica de sobreventa. Hay muchos sistemas de mensajería atractivos que tienen enlaces Haskell, p. MessagePack, 0MQ o Thrift. En mi humilde opinión, lo único que debe agregar es un direccionamiento adecuado de los procesos y decidir quién/qué está administrando esta capacidad de direccionamiento.

Por cierto: una serie de codificadores adoptan, p. 0MQ en sus entornos Erlang, simplemente porque ofrece la posibilidad de estructurar los mensajes a través de intermediarios de mensajes en lugar de confiar en procesos puros para procesar mensajes en una súper escala.

En un "mundo masivamente multinúcleo", asumo personalmente que los enfoques de memoria compartida eventualmente estarán superando a la mensajería. Alguien siempre puede venir y discutir con la asincronía, por supuesto. Pero cuando escribes que quieres "unir" tus procesos mediante "varios procesos principales", en realidad hablas de sincronización. Además, puede por supuesto challenge si una sola función, proceso o hilo es el nivel correcto de paralelización.

En resumen: Probablemente vería si MessagePack o 0MQ podrían satisfacer mis necesidades en Haskell y cuidar el resto en mi código.

+1

Son buenos puntos, pero agregaría que la memoria compartida y la mensajería no son competitivas, sino modelos complementarios. MPI y OpenMP se combinan con frecuencia de maneras que juegan con las fortalezas de cada modelo. Ahora estoy trabajando en algo similar con la mónada 'Par', donde el paralelismo de memoria compartida ejecuta cálculos que pueden enviarse entre nodos con paso de mensajes. – acfoltzer

+1

Ciertamente correcto. Sin embargo, creo que, por ejemplo, 10G Ethernet es lo suficientemente bueno como para hacer viables los enfoques de memoria compartida más allá de los límites del sistema físico. Mire [RoCe] (http://dl.acm.org/citation.cfm?id=1634475) y [iWARP] (http://en.wikipedia.org/wiki/IWARP). Espero que pueda ganar un patrocinador comercial para un banco de pruebas. –

+0

Para aquellos de nosotros que somos nuevos en todo esto, ¿qué quiere decir con "enfoques de memoria compartida"? – jberryman

Cuestiones relacionadas