java - resueltos - programación concurrente y distribuida
Técnicas de programación concurrente, pros, contras. (4)
Con la API de concurrencia de Java 5, realizar una programación concurrente en Java no tiene por qué ser engorroso y difícil siempre que se aprovechen las utilidades de alto nivel y se usen correctamente. Encontré que el libro, Java Concurrency in Practice de Brian Goetz, es una excelente lectura sobre este tema. En mi último trabajo, utilicé las técnicas de este libro para hacer que algunos algoritmos de procesamiento de imágenes se escalasen a varias CPU y para canalizar las tareas de la CPU y del disco. Me pareció una gran experiencia y obtuvimos excelentes resultados.
O si estás usando C ++, puedes probar OpenMP, que usa las directivas #pragma para hacer los bucles en paralelo, aunque yo nunca lo he usado.
Hay al menos tres enfoques conocidos para crear aplicaciones concurrentes:
Sincronización multihilo y memoria mediante bloqueo (.NET, Java). La memoria transaccional del software ( texto de enlace ) es otro enfoque de la sincronización.
Mensaje asíncrono de paso (erlang).
Me gustaría saber si hay otros enfoques y discutir varias ventajas y desventajas de estos enfoques aplicados a grandes aplicaciones distribuidas. Mi enfoque principal es simplificar la vida del programador.
Por ejemplo, en mi opinión, usar varios subprocesos es fácil cuando no hay dependencias entre ellos, lo cual es bastante raro. En todos los demás casos, el código de sincronización de subprocesos se vuelve bastante engorroso y difícil de depurar y razonar.
En Erlang y OTP en Acción , los autores presentan cuatro paradigmas de comunicación de procesos:
Memoria compartida con cerraduras.
Una construcción ( bloqueo ) se utiliza para restringir el acceso a los recursos compartidos. El soporte de hardware a menudo se requiere del sistema de memoria, en términos de instrucciones especiales. Entre los posibles inconvenientes de este enfoque: la sobrecarga, los puntos de contención en el sistema de memoria, la dificultad de depuración, especialmente con una gran cantidad de procesos.
Software de memoria transaccional
La memoria se trata como una base de datos , donde las transacciones deciden qué escribir y cuándo. El problema principal aquí está representado por las posibles contenciones y por el número de intentos de transacción fallidos.
Futuros, promesas y similares.
La idea básica es que un futuro es el resultado de un cálculo que se ha subcontratado a un proceso diferente (potencialmente en una CPU o máquina diferente) y que puede transmitirse como cualquier otro objeto. En caso de fallas en la red puede surgir un problema.
Paso de mensajes
Sincrónico o asíncrono, en estilo Erlang .
Lee la columna de Concurrencia Efectiva de Herb Sutter , y tú también serás iluminado.
Recomiendo encarecidamente ver esta presentación de Rich Hickey. Describe un enfoque para construir aplicaciones concurrentes de alto rendimiento que, según mi opinión, son distintas de los diseños basados en bloqueo o de paso de mensajes.
Básicamente destaca:
- Bloquea aplicaciones concurrentes multihilo gratis
- Estructuras de datos persistentes inmutables.
- Cambios en el estado manejados por Software Transactional Memory
Y habla de cómo estos principios influyeron en el diseño del lenguaje Clojure .