Pregunta

El panorama de la arquitectura de CPU ha cambiado, los núcleos múltiples es una tendencia que cambiará la forma en que debemos desarrollar software.He realizado desarrollo multiproceso en C, C++ y Java, he realizado desarrollo multiproceso utilizando varios mecanismos IPC.Los enfoques tradicionales de uso de subprocesos no parecen facilitarle al desarrollador el uso de hardware que admita un alto grado de concurrencia.

¿Qué lenguajes, bibliotecas y técnicas de desarrollo conoce que ayudan a aliviar los desafíos tradicionales de la creación de aplicaciones concurrentes?Obviamente estoy pensando en cuestiones como los puntos muertos y las condiciones de carrera.Técnicas de diseño, bibliotecas, herramientas, etc.También son interesantes que ayudan a aprovechar y garantizar que se utilicen los recursos disponibles; simplemente escribir una aplicación con subprocesos segura y robusta no garantiza que esté utilizando todos los núcleos disponibles.

Lo que he visto hasta ahora es:

  • erlang:basado en procesos, transmisión de mensajes IPC, el 'modelo de concurrencia del actor'
  • dramatis:biblioteca de modelos de actores para Ruby y Python
  • escala:Lenguaje de programación funcional para JVM con soporte de concurrencia adicional.
  • Clojure:lenguaje de programación funcional para la JVM con una biblioteca de actores
  • Termita:un puerto del enfoque de proceso de Erlang y el paso de mensajes a Scheme

¿Qué más sabes, qué te ha funcionado y qué crees que es interesante de ver?

¿Fue útil?

Solución

Yo sugeriría dos cambios de paradigma:

Memoria transaccional de software

Quizás quieras echarle un vistazo al concepto de Memoria transaccional de software (STM).La idea es utilizar concurrencia optimista:cualquier operación que se ejecute en paralelo a otras intenta completar su trabajo en una transacción aislada;Si en algún momento se ha confirmado otra transacción que invalida los datos en los que está trabajando esta transacción, el trabajo de la transacción se desecha y la transacción se ejecuta nuevamente.

Creo que la primera implementación ampliamente conocida de la idea (si no la prueba de concepto y la primera) es la de Haskell: Artículos y presentaciones sobre memoria transaccional en Haskell..Muchas otras implementaciones se enumeran en Artículo STM de Wikipedia.

Bucles de eventos y promesas

Otra forma muy diferente de lidiar con la concurrencia se implementa en el [lenguaje de programación E](http://en.wikipedia.org/wiki/E_(programming_language%29).

Tenga en cuenta que su forma de abordar la concurrencia, así como otras partes del diseño del lenguaje, se basa en gran medida en el modelo Actor.

Otros consejos

Mencionaste Java, pero solo mencionas subprocesos.¿Has mirado la biblioteca concurrente de Java?Viene incluido con Java 5 y superior.

Es una biblioteca muy buena que contiene ThreadPools y CopyOnWriteCollections, por nombrar algunos.Consulta la documentación en el Tutorial de Java.O si lo prefieres, los documentos de Java.

he usado Procesando para pitón.Imita la API del enhebrar módulo y por lo tanto es bastante fácil de usar.

Si por casualidad usas map/imap o un generador/lista de comprensión, convirtiendo su código para usar processing es sencillo:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

se puede paralelizar con

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

que utilizará todos los procesadores que tengas para calcular los resultados.También hay perezosos (Pool.imap) y variantes asincrónicas (Pool.map_async).

Hay una clase de cola que implementa Queue.Queue, y trabajadores que son similares a los hilos.

Problemas

processing está basado en fork(), que debe emularse en Windows.Los objetos se transfieren a través de pickle/unpickle, así que debes asegurarte de que esto funcione.Es posible que bifurcar un proceso que ya ha adquirido recursos no sea lo que desea (piense en conexiones de bases de datos), pero en general funciona.Funciona tan bien que se ha agregado rápidamente a Python 2.6 (cf. PEP-317).

Intel Bloques de construcción de enhebrado para C++ me parece muy interesante.Ofrece un nivel de abstracción mucho mayor que los hilos en bruto.O'Reilly tiene una muy bonito libro si te gusta la documentación de árboles muertos.Ver también, ¿Alguna experiencia con los bloques de construcción Threading de Intel?.

Yo diría:

Modelos:Hilos + estado compartido, actores + paso de mensajes, memoria transaccional, mapa/reducción.Idiomas:Erlang, Io, Scala, Clojure, Bibliotecas de Reia:Retlang, Jetlang, Kilim, Cilk++, horquilla/unión, MPI, Kamaelia, Terracota

Mantengo un blog de enlaces de concurrencia sobre cosas como esta (Erlang, Scala, subprocesos de Java, modelo de actor, etc.) y publico un par de enlaces al día:

http://concurrency.tumblr.com

He estado haciendo programación concurrente en Ada durante casi 20 años.

El lenguaje en sí (no alguna biblioteca agregada) admite subprocesos ("tareas"), múltiples modelos de programación y múltiples paradigmas de sincronización.Incluso puedes crear tus propios esquemas de sincronización utilizando las primitivas integradas.

Puedes pensar en el de Ada. cita como una especie de instalación de sincronización orientada a procedimientos, mientras que objetos protegidos están más orientados a objetos.Los encuentros son similares al antiguo concepto CS de monitores, pero mucho más poderoso.Los objetos protegidos son tipos especiales con primitivas de sincronización que le permiten crear cosas exactamente como bloqueos del sistema operativo, semáforos, eventos, etc.Sin embargo, es lo suficientemente potente como para que también puedas inventar y crear tus propios tipos de objetos de sincronización, según tus necesidades exactas.

La pregunta ¿Qué modelo de programación paralela recomienda hoy para aprovechar los procesadores de muchos núcleos del mañana? ya se ha preguntado.Allí también di la siguiente respuesta.

Kamaelia es un marco de Python para crear aplicaciones con muchos procesos de comunicación.

Kamaelia: la concurrencia se vuelve útil y divertida

En Kamaelia construyes sistemas a partir de Componentes simples que se comunican entre sí..Esto acelera el desarrollo, ayuda enormemente al mantenimiento y también significa que usted construir software naturalmente concurrente.Está destinado a ser accesible por cualquier desarrollador, incluidos los principiantes.También lo hace divertido :)

¿Qué tipo de sistemas?Servidores de red, clientes, aplicaciones de escritorio, juegos basados ​​en pygame, sistemas y canales de transcodificación, sistemas de televisión digital, erradicadores de spam, herramientas de enseñanza y mucho más :)

Aquí hay un vídeo de Pycon 2009.Comienza comparando Kamaelia con Twisted y Parallel Python y luego hace una demostración práctica de Kamaelia.

Fácil concurrencia con Kamaelia - Parte 1 (59:08)
Fácil concurrencia con Kamaelia - Parte 2 (18:15)

Estoy vigilando de cerca Extensiones paralelas para .NET y LINQ paralelo.

yo se de Reia - un lenguaje basado en Erlang pero que se parece más a Python/Ruby.

OpenMP.

Maneja subprocesos por usted para que usted solo se preocupe por qué partes de su aplicación C++ desea ejecutar en paralelo.

p.ej.

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

El código anterior ejecutará el bucle for en tantos subprocesos como le haya indicado al tiempo de ejecución de openmp, por lo que si el TAMAÑO es 100 y tiene una caja de cuatro núcleos, ese bucle for ejecutará 25 elementos en cada núcleo.

Hay algunas otras extensiones paralelas para varios idiomas, pero las que más me interesan son las que se ejecutan en tu tarjeta gráfica.Eso es un procesamiento paralelo real :) (ejemplos: GPU++ y libSh)

C++ 0x proporcionará std::lock funciones para bloquear más de un mutex juntos.Esto ayudará a aliviar el punto muerto debido a un bloqueo desordenado.Además, la biblioteca de subprocesos C++ 0x tendrá promesas, futuros y tareas empaquetadas, que permiten que un subproceso espere el resultado de una operación realizada en otro subproceso sin ningún bloqueo a nivel de usuario.

multiprocessing es una biblioteca de Python que simplifica la programación de múltiples núcleos, como se menciona en otra respuesta.

Programa escrito con python multiprocessing se puede modificar fácilmente para enviar el trabajo a la nube, en lugar de a núcleos locales. piCloud aprovecha eso para proporcionar una gran potencia de procesamiento bajo demanda en la nube:solo necesitas modificar 2 líneas de tu código.

Entonces, aquí está la conclusión:Al seleccionar una biblioteca para múltiples núcleos, uno puede preguntarse si un enfoque en la nube también tendría sentido.

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