Siguiente en concurrencia

9

Durante el año pasado, he estado trabajando mucho en la concurrencia en Java y he desarrollado y trabajado en muchos paquetes concurrentes. Entonces, en términos de desarrollo en el mundo concurrente, tengo bastante confianza. Además, estoy muy interesado en aprender y comprender más sobre la programación concurrente.

Pero no puedo responderme a mí mismo, ¿qué sigue? ¿Qué extra debo aprender o trabajar para heredar más habilidades relacionadas con el procesamiento de múltiples núcleos? ¿Si hay algún buen libro (leído y disfrutado de 'concurrencia en la práctica' y 'programación concurrente en Java') o recursos relacionados con el procesamiento de múltiples núcleos para que pueda pasar al siguiente nivel?

Jatin
fuente
Si se ha perdido los fundamentos teóricos, apréndalos ahora: en.wikipedia.org/wiki/Pi-calculus
SK-logic

Respuestas:

8

Descargo de responsabilidad: no soy un experto en concurrencia, pero mi coautor sí, lo estoy refiriendo a él :-)

Como has leído los libros de Doug Lea y Brian Goetz, definitivamente has cubierto el mejor material disponible hasta la fecha.

En el futuro, están las nuevas mejoras de concurrencia en Java 7. Lo más notable es el framework Fork / Join y las nuevas API asíncronas NIO.

Java 8 introducirá nuevas mejoras de concurrencia con colecciones lambdas / paralelas.

Otra cosa a considerar seriamente son formas alternativas de tratar con la concurrencia. Para ser franco, el enfoque de 'bloquear objetos mutables' de Java siempre será propenso a errores, sin importar cuánto se mejoren las API. Por lo tanto, recomiendo mirar el modelo de actor de Scala y el STM de Clojure como formas alternativas de lidiar con los problemas de concurrencia mientras se mantiene la interoperabilidad con Java.

[advertencia -> autopublicidad] Así que, naturalmente, recomendaré nuestro próximo libro, The Well-Grounded Java Developer , que cubre todas las cosas que mencioné anteriormente: -). [/ warning]

Para no olvidarlo, Groovy también tiene una librería Gpars altamente recomendada, aunque no la he usado personalmente.

Martijn Verburg
fuente
Ja muchas gracias por el libro :). Se puede también, por favor sugerir algún otro libro bueno como su libro recomendada no está disponible aquí (edición local) en India.PS: concurrencia en la práctica es una joya de un libro
Jatin
@Martijn, Neat! Tengo curiosidad sobre Groovy y Scala desde hace un tiempo y quería jugar con él para aprender más. ¿Su libro está dirigido a principiantes en estos idiomas o asume experiencia previa?
maple_shaft
@Jatin Puri - Realmente no conozco ningún otro título sobre 'concurrencia en la práctica' y 'programación concurrente en Java', está el título O'Reilly de 'Java Threads' de Henry Wong, pero eso es todo.
Martijn Verburg
@maple_shift - Está dirigido a principiantes :-)
Martijn Verburg
2

El lenguaje de programación D proporciona dos paradigmas para la programación concurrente, los cuales tienen sus usos y son bastante interesantes.

std.concurrency proporciona el paso de mensajes sin uso compartido de memoria predeterminado. Todas las variables globales y estáticas en D son subproceso local por defecto y spawny sendno permiten el envío de mensajes que contienen indirección de puntero mutable. Se puede obtener un intercambio limitado a través de la sharedpalabra clave, lo que implica una verificación adicional por parte del sistema de tipos. Fuera del dialecto seguro del lenguaje, puede forzar las variables globales / compartidas clásicas de estilo C / Java utilizando la __gsharedpalabra clave, pero todas las apuestas están desactivadas en lo que respecta a la seguridad de la carrera. Este modelo se detalla en un capítulo gratuito del libro de Andrei Alexandresu "El lenguaje de programación D".

std.parallelism es menos seguro pero, en algunos aspectos, más flexible que std.concurrency y está orientado específicamente a datos multinúcleo y paralelismo de tareas para aumentar el rendimiento del procesamiento de datos en lugar de la concurrencia de casos generales. Cuenta con un bucle foreach paralelo, llamadas de función asincrónicas, reducciones paralelas, etc. Proporciona mecanismos para facilitar la escritura de código seguro para la carrera, pero hacerlo aún requiere cierto grado de disciplina.

Una discusión más exhaustiva sobre los dos paradigmas principales de subprocesos múltiples en D se puede encontrar en mi artículo reciente sobre el tema.

dsimcha
fuente
2

Te sugiero que vayas y eches un vistazo a Clojure

El enfoque de la concurrencia es muy novedoso y, en mi opinión, un avance significativo en lo que se ve en Java y en la mayoría de los otros lenguajes. Algunos puntos clave:

  • La identidad y el estado están separados : OOP completa la identidad del objeto con su estado actual en forma de variables miembro mutables. Clojure separa estrictamente la identidad (referencias administradas) y el estado (estructuras de datos inmutables) de una manera que simplifica significativamente el desarrollo de programas concurrentes confiables.
  • Estructuras de datos inmutables persistentes : dado que todo es inmutable, puede tomar una instantánea de los datos / estado en cualquier momento y estar seguro de que no se mutará debajo de usted. Pero mejor que eso: son estructuras de datos persistentes que comparten datos con versiones anteriores. Como resultado, las operaciones están mucho más cerca de O (1) en lugar de O (n) que pagaría por una estrategia de copia en escritura para datos inmutables.
  • Memoria transaccional de software : en lugar de usar bloqueos, solo encierra el código en un bloque (dosync ...) y se ejecutan automáticamente como una transacción. Sin riesgo de puntos muertos y sin necesidad de desarrollar estrategias complejas de bloqueo. Esta es una victoria masiva, especialmente cuando se combina con las estructuras de datos inmutables anteriores. Efectivamente, Clojure implementa el control de concurrencia de múltiples versiones en su STM.
  • El paradigma de programación funcional se utiliza para facilitar la escritura de código concurrente confiable. Básicamente, si toma una estructura de datos inmutable, la ejecuta a través de una función pura y genera una estructura de datos inmutable diferente, entonces su código está garantizado para la concurrencia.

Sugeriría ver este video como introducción

mikera
fuente
1

Eche un vistazo al lenguaje Scala, que extiende Java y se ejecuta en la JVM. Toma prestada la noción de "Actores" de Erlang, y brinda una buena capacidad para manejar fallas de concurrencia.

Matthew Flynn
fuente
1

Si desea llevarlo a un nivel completamente nuevo, es posible que desee estudiar la programación con CUDA .

Esto le permite distribuir sus algoritmos en cientos de núcleos de procesamiento en su tarjeta gráfica en lugar de los pocos núcleos principales de la CPU. Incluso hay enlaces de idioma que aparentemente hacen que sea relativamente fácil acelerar lenguajes de alto nivel como python usando técnicas GPGPU .

Mark Booth
fuente
@Chiron - Para ser honesto, me sorprendió que nadie más lo hubiera mencionado ya.
Mark Booth