SlideShare a Scribd company logo
1 of 49
Download to read offline
Programación concurrente con Groovy




Wednesday, May 30, 12
Hola!
              Mario García (@marioggar)
                    Freelance Software alchemist
                    Groovy passionate!




                    Madrid Groovy User Group member (@MadridGUG)




Wednesday, May 30, 12
¿Qué es GPars?
              Es un framework que proporciona a los desarrolladores
              Java una forma segura e intuitiva de manejar tareas
              concurrentes
              Escrito en su mayoría en Java
              Sospechosos habituales:
                    Vaclav Pech (Jetbrains)




Wednesday, May 30, 12
¿Por qué usar GPars?
              Usas Groovy o Java
              Quieres escribir código empleando concurrencia ó
              paralelismo
              Vas a usar hardware de varios nucleos
              La programación concurrente siempre te ha parecido
              muy compleja.
              PORQUE ESTA INCLUIDO EN GROOVY



Wednesday, May 30, 12
¿Qué vamos a ver?
              Ayudas a nivel de código
              Conceptos a nivel de arquitectura
              Protección de objetos compartidos




Wednesday, May 30, 12
Ayudas a nivel de código




Wednesday, May 30, 12
Ayudas a nivel de código
              Estas ayudas nos permitirán escribir código
              concurrente variando poco o nada nuestro código
              actual.
                    Parallel Arrays (fork/join)
                    Syntaxis mas funcional (map/reduce/filter)
                    Ejecución asincrona de funciones (closures)




Wednesday, May 30, 12
Parallel Arrays




Wednesday, May 30, 12
Parallel Arrays
              Todos los métodos que utilizabamos sobre colecciones
              tienen ahora a su “hermano paralelo”.
                    findAll --> findAllParallel, collect--> collectParallel
                    Estos métodos nos permiten realizar las mismas
                    tareas de manera parallela cordinandolas a la
                    finalizacion de la misma.
              Basado en Fork/Join jsr166




Wednesday, May 30, 12
def findAllPeopleNameOver30AndSingle(people){
                  people.
                   findAll{it.age >30}.
                   collect{it.name}
             }




Wednesday, May 30, 12
def findAllPeopleNameOver30AndSingle(people){
                GParsPool.withPool {
                  people.
                   findAllParallel{it.age >30}.
                   collectParallel{it.name}
                }
             }




Wednesday, May 30, 12
Ayudas a nivel de código
                    GParsPool.withPool
                        La clase GParsPool es la que permite el DSL de
                        concurrencia para collecciones y objetos
                          groovyx.gpars.GParsPool
                        El método withPool puede tomar como
                        parametros el numero de hilos creados en el pool
                        y un manejador de excepciones




Wednesday, May 30, 12
Parallel Arrays
              Meta-class enchancer
                    Si no queremos “encerrar” nuestro código con
                    withPool{ ... } podemos utilizar la clase
                    ParallelEnhancer
                    groovyx.gpars.ParallelEnhancer
                    Agregara al metaClass de nuestra coleccion las
                    nuevas funciones concurrentes.




Wednesday, May 30, 12
def findAllPeopleNameOver30AndSingle(people){
                ParallelEnhancer.enhanceInstance(people)
                people.
                   findAllParallel{it.age > 30}.
                   collectParallel{it.name}
             }




Wednesday, May 30, 12
Parallel Arrays
              Umm no podría hacerlo con menos?
              Claro!! :)
              Podemos seguir utilizando la misma sintaxis de
              colecciones bien utilizando el método
              makeConcurrent() sobre una colección...




Wednesday, May 30, 12
def findAllPeopleNameOver30AndSingle(people){
                ParallelEnhancer.enhanceInstance(people)
                people.makeConcurrent().
                   findAll{it.age > 30}.
                   collect{it.name}
             }




Wednesday, May 30, 12
Parallel Arrays
              ...Bien manteniendo nuestro método original e
              invocandole pasandole como parametro una colección
              concurrente.




Wednesday, May 30, 12
def findAllPeopleNameOver30AndSingle(people){
               people.
                  findAll{it.age > 30}.
                  collect{it.name}
            }

                ParallelEnhancer.enhanceInstance(people)
                findAllPeopleNameOver30AndSingle(
                   people.makeConcurrent()
                )



Wednesday, May 30, 12
Parallel Arrays
              Un gatito muere en algun lugar cuando:
                    Se accede a una colección not-thread-safe desde un
                    método “parallel”
                    Se crea una closure con estado. Todas las closures
                    que se pasan como parametro a un método paralelo
                    deben de ser thread-safe o dicho de otro modo
                    deben ser “sin estado”




Wednesday, May 30, 12
Parallel Arrays
                    def findAllPeopleNameOver30AndSingle(people){
                        def result = []
                        ParallelEnhancer.enhanceInstance(people)
                        people.
                            findAllParallel{it.age > 30}.
                            eachParallel{ result << it.name}

                          result
                    }
                                               Miaoooouuuu

Wednesday, May 30, 12
Map/Reduce




Wednesday, May 30, 12
Map/Reduce
              La DSL Map/Reduce para el manejo de colecciones da
              a GPars un sabor más “funcional”.
              Map/Reduce “rinde más rápido” que los métodos
              xxxParallel para operaciones encadenadas sobre una
              coleccion paralela
              Algunos métodos map/reduce se pueden usar de la
              misma manera que los metodos xxxParallel ya que
              tienen semanticas parecidas



Wednesday, May 30, 12
Map/Reduce
             def findAllPeopleNameOver30AndSingle(people){
                ParallelEnhancer.enhanceInstance(people)
                people.parallel.
                   filter{it.age > 30}.
                   map{it.name}.collection
             }




Wednesday, May 30, 12
Map/Reduce
              Cada ejecución xxxParallel hace la conversión
              paralela-->normal para cumplir con el contrato de los
              métodos no paralelos.
              Los métodos Map/Reduce se ejecutan sobre una la
              colección paralela. Usamos la propiedad parallel para
              acceder a ella.
              Los métodos Map/Reduce devuelven una colección
              paralela. Cuando queramos que devuelvan una
              colección normal utilizamos la propiedad collection


Wednesday, May 30, 12
Map/Reduce

               soccerDays.parallel.
                  filter{it.fieldViewers > 1000000}.
                  map{[it,(it.soccerPlayers / it.fieldViewers) * 100]}.
                  filter{it[1] > 0.018}.
                  map{it[0].day}.collection




Wednesday, May 30, 12
Ejecución asincrona
              Combinar la ejecución asincrona de varias tareas y
              pasarlas como argumentos a otras funciones
                    Hay tareas que se pueden descomponer en varias subtareas
                    más sencillas

                    Mientras que habrá subtareas que tarden en ejecutarse, puede
                    que otras solo tarden un momento

                    Si ejecutaramos secuencialmente las tareas, las pesadas
                    bloquearian a las ligeras.




Wednesday, May 30, 12
Ejecución asincrona
              Ejemplo: Media Aritmetica
                        Composición de closures:
                          Hay que dividir la computación del problema en diferentes
                          closures

                          La ejecución de cada closure por separado es inmutable,
                          no depende de los datos de la otra

                          Se combinaran en una tercera closure que cordinará los
                          resultados de ambas




Wednesday, May 30, 12
Ejecución asincrona
                        def peopleYears = {people-> people*.age.sum()}.asyncFun()
                        def howManyPeople = {people-> people.size()}.asyncFun()
                        def avg = {yearsSum,peopleSize->
                            yearsSum/peopleSize
                        }.asyncFun()

                        avg(
                          peopleYears(people),
                          howManyPeople(people)
                        )




Wednesday, May 30, 12
Conceptos a nivel de
         arquitectura



Wednesday, May 30, 12
Concetos a nivel...
              En esta parte veremos partes de GPars más
              avanzadas que requieren que planteemos nuestra
              aplicación de otra manera
                    Dataflow
                    Actores




Wednesday, May 30, 12
Dataflow
              GPars nos permite definir procesos como un flujo de
              datos en lugar de como un flujo de ejecución
              Se genera un arbol de dependencias entre datos




Wednesday, May 30, 12
Dataflow


                Upps...




Wednesday, May 30, 12
Dataflow
                               result



                        top                 states




                        rows            Esto esta mejor...




Wednesday, May 30, 12
Dataflow
              Demo: Tornados en Estados Unidos
                    Recuperamos todos los ocurridos (rows)

                    Recuperamos el maestro de estados (states)

                    Recogemos los 3 más peligrosos (result)

                    Recogemos los nombres (result)

                    Contabilizamos fecha de finalización (end)




Wednesday, May 30, 12
Dataflow
                        def flow = new Dataflows()
                        task {
              1)          flow.rows = getTornadoRows()
                          flow.remoteData = getSimulatedDataFromARemoteHost()
                        }
              2)        task {flow.states = getStateRows()}
              3)        task {flow.top = ... }
                        task {
                          flow.result = flow.top.collect{data->
              4)
                             flow.states.find{s-> s.stateCode == data.stateCode}.stateName
                          }
                          flow.end = System.currentTimeMillis()
                        }




Wednesday, May 30, 12
Dataflow
              Flow:

                    1) Se descargan los datos de los tornados y unos datos
                    remotos (Estos ultimos hacen esperar un poco el proceso)

                    2) Esta tarea como no tiene ninguna dependencia se ejecuta a
                    la vez que la tarea uno evitando la espera del proceso remoto

                    3) Se ejecuta cuando se han resuelto las variables de la tarea 1

                    4) Se ejecuta cuando se han resuelto las variables de las tareas
                    2 y 3 (flow.top y flow.states)




Wednesday, May 30, 12
Dataflow
              Solución bastante elegante estableciendo
              dependencias entre datos
              Cuidado con las dependencias circulares == deadlock
              No lo recomiendo para arboles “muy grandes”. Se
              pierde el objetivo y se puede acabar en el punto
              anterior.




Wednesday, May 30, 12
Actors




Wednesday, May 30, 12
Actors



              NO ESTOS NO




Wednesday, May 30, 12
Actors
              Los actores nos permiten la cordinación explicita entre
              procesos asincronos.
              Recomendado para tareas complejas con
              dependencias de paso de mensajes entre ambas.
              Simula el paradigma de envio de mensajes (send,reply)




Wednesday, May 30, 12
Actors
              Inspirado en los Actores de Scala pero mejorado.
                    Actores con estado: Solo en casos concretos
                    Actores sin estado: recomendados




Wednesday, May 30, 12
Actors
              Demo: F1
                    Tenemos una serie de corredores cuyos coches
                    tienen que notificar a direccion de carrera su
                    posición.
                    Actores implicados
                        Conductores: Notifican su posición
                        Comisario de carrera: Notifica el estado de la
                        carrera


Wednesday, May 30, 12
¿Para qué podemos usarlo?




Wednesday, May 30, 12
¿Para qué?
              Ideal para:
                    Procesos de calculo matemático
                    Procesos en arbol con nodos inmutables pero
                    dependientes como por ejemplo:
                        Ejemplo: Media aritmetica. La suma de elementos me la da un servicio que
                        tarda x, pero mientras espero puedo calcular el numero total de elementos.

                        En general procesos en los que tienes que componer datos dependiendo
                        de otros que provinenen de diferentes fuentes heterogeneas y con alta
                        latencia.




Wednesday, May 30, 12
¿Para qué?
              Ideal para:
                    Programación funcional (Map/Reduce)
                    Programación orientada a eventos (Actores)




Wednesday, May 30, 12
GPars es mucho más
              Agents
              Speculations
              STM (Software Transactional Memory)
              ...




Wednesday, May 30, 12
GPars es mucho más
              Página proyecto
                    http://gpars.codehaus.org/
              Libros
                    Groovy In Action (2nd Ed)
                        (Contiene un capítulo dedicado unicamente a GPars)




Wednesday, May 30, 12
GPars es mucho más
              Blogs, videos...
                    Paul King (Video) GPars Concurrency

                        http://www.youtube.com/watch?v=dUDKnIIWw48

                    Tomas Lin: Grails/Gorm con GPars

                        http://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with-
                        grails-gsql-and-gpars/

                    Arturo Herrero (Slide) Functional Groovy

                        http://www.slideshare.net/arturoherrero/functional-programming-with-groovy




Wednesday, May 30, 12
Q&A




Wednesday, May 30, 12

More Related Content

More from Mario García

Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)Mario García
 
Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)Mario García
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burritMario García
 
Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truthMario García
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyMario García
 
Test Motherfucker...Test
Test Motherfucker...TestTest Motherfucker...Test
Test Motherfucker...TestMario García
 
Greach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonGreach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonMario García
 

More from Mario García (14)

Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)Groovy 2.5 and 3.0 (Spanish)
Groovy 2.5 and 3.0 (Spanish)
 
GraphQL & Ratpack
GraphQL & RatpackGraphQL & Ratpack
GraphQL & Ratpack
 
GraphQL y Groovy
GraphQL y GroovyGraphQL y Groovy
GraphQL y Groovy
 
Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)Calidad del codigo (MadridGUG)
Calidad del codigo (MadridGUG)
 
GraphQL and Groovy
GraphQL and GroovyGraphQL and Groovy
GraphQL and Groovy
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burrit
 
Creating ASTTs The painful truth
Creating ASTTs The painful truthCreating ASTTs The painful truth
Creating ASTTs The painful truth
 
Groovy android
Groovy androidGroovy android
Groovy android
 
Groovy on Android
Groovy on AndroidGroovy on Android
Groovy on Android
 
Gpars Workshop 2014
Gpars Workshop 2014Gpars Workshop 2014
Gpars Workshop 2014
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Test Motherfucker...Test
Test Motherfucker...TestTest Motherfucker...Test
Test Motherfucker...Test
 
Gradle vs Maven
Gradle vs MavenGradle vs Maven
Gradle vs Maven
 
Greach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con GriffonGreach 2011 : Creando Plugins Con Griffon
Greach 2011 : Creando Plugins Con Griffon
 

Recently uploaded

herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaJadeVilcscordova
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024NicolleAndrade7
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaRicardoEstrada90
 
CARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbx
CARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbxCARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbx
CARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbxCesarAntonioGascoTiz1
 
Editorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfEditorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfYanitza28
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...axelv9257
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.241534381
 
innovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 bloginnovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 blogManuel Diaz
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfYanitza28
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxcj12paz
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxJOELGARCIA849853
 
Imágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónImágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónUniversidad de Sonora
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8antoniopalmieriluna
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionEmanuelMuoz11
 
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptxAVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptxdulcemonterroza
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosYOMIRAVILLARREAL1
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC6dwwcgtpfx
 
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxTarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxVICTORMANUELBEASAGUI
 
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdfjuan23xpx
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónAntonia Yamilet Perez Palomares
 

Recently uploaded (20)

herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el tema
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024
 
Desarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - EstradaDesarrollo del Dominio del Internet - Estrada
Desarrollo del Dominio del Internet - Estrada
 
CARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbx
CARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbxCARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbx
CARPETA PEDAGOGICA DE TOE.docbbbbbbbbbbbx
 
Editorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfEditorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdf
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.
 
innovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 bloginnovacion banking & warehouse 2024 blog
innovacion banking & warehouse 2024 blog
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdf
 
Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptx
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
 
Imágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la informaciónImágenes digitales: Calidad de la información
Imágenes digitales: Calidad de la información
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacion
 
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptxAVANCES TECNOLOGICOS  DEL SIGLO XXI. 10-08..pptx
AVANCES TECNOLOGICOS DEL SIGLO XXI. 10-08..pptx
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de Datos
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
 
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxTarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
 
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
¡Ya basta! Sanidad Interior - Angela Kellenberger.pdf
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
 

Programación concurrente con GPars

  • 1. Programación concurrente con Groovy Wednesday, May 30, 12
  • 2. Hola! Mario García (@marioggar) Freelance Software alchemist Groovy passionate! Madrid Groovy User Group member (@MadridGUG) Wednesday, May 30, 12
  • 3. ¿Qué es GPars? Es un framework que proporciona a los desarrolladores Java una forma segura e intuitiva de manejar tareas concurrentes Escrito en su mayoría en Java Sospechosos habituales: Vaclav Pech (Jetbrains) Wednesday, May 30, 12
  • 4. ¿Por qué usar GPars? Usas Groovy o Java Quieres escribir código empleando concurrencia ó paralelismo Vas a usar hardware de varios nucleos La programación concurrente siempre te ha parecido muy compleja. PORQUE ESTA INCLUIDO EN GROOVY Wednesday, May 30, 12
  • 5. ¿Qué vamos a ver? Ayudas a nivel de código Conceptos a nivel de arquitectura Protección de objetos compartidos Wednesday, May 30, 12
  • 6. Ayudas a nivel de código Wednesday, May 30, 12
  • 7. Ayudas a nivel de código Estas ayudas nos permitirán escribir código concurrente variando poco o nada nuestro código actual. Parallel Arrays (fork/join) Syntaxis mas funcional (map/reduce/filter) Ejecución asincrona de funciones (closures) Wednesday, May 30, 12
  • 9. Parallel Arrays Todos los métodos que utilizabamos sobre colecciones tienen ahora a su “hermano paralelo”. findAll --> findAllParallel, collect--> collectParallel Estos métodos nos permiten realizar las mismas tareas de manera parallela cordinandolas a la finalizacion de la misma. Basado en Fork/Join jsr166 Wednesday, May 30, 12
  • 10. def findAllPeopleNameOver30AndSingle(people){ people. findAll{it.age >30}. collect{it.name} } Wednesday, May 30, 12
  • 11. def findAllPeopleNameOver30AndSingle(people){ GParsPool.withPool { people. findAllParallel{it.age >30}. collectParallel{it.name} } } Wednesday, May 30, 12
  • 12. Ayudas a nivel de código GParsPool.withPool La clase GParsPool es la que permite el DSL de concurrencia para collecciones y objetos groovyx.gpars.GParsPool El método withPool puede tomar como parametros el numero de hilos creados en el pool y un manejador de excepciones Wednesday, May 30, 12
  • 13. Parallel Arrays Meta-class enchancer Si no queremos “encerrar” nuestro código con withPool{ ... } podemos utilizar la clase ParallelEnhancer groovyx.gpars.ParallelEnhancer Agregara al metaClass de nuestra coleccion las nuevas funciones concurrentes. Wednesday, May 30, 12
  • 14. def findAllPeopleNameOver30AndSingle(people){ ParallelEnhancer.enhanceInstance(people) people. findAllParallel{it.age > 30}. collectParallel{it.name} } Wednesday, May 30, 12
  • 15. Parallel Arrays Umm no podría hacerlo con menos? Claro!! :) Podemos seguir utilizando la misma sintaxis de colecciones bien utilizando el método makeConcurrent() sobre una colección... Wednesday, May 30, 12
  • 16. def findAllPeopleNameOver30AndSingle(people){ ParallelEnhancer.enhanceInstance(people) people.makeConcurrent(). findAll{it.age > 30}. collect{it.name} } Wednesday, May 30, 12
  • 17. Parallel Arrays ...Bien manteniendo nuestro método original e invocandole pasandole como parametro una colección concurrente. Wednesday, May 30, 12
  • 18. def findAllPeopleNameOver30AndSingle(people){ people. findAll{it.age > 30}. collect{it.name} } ParallelEnhancer.enhanceInstance(people) findAllPeopleNameOver30AndSingle( people.makeConcurrent() ) Wednesday, May 30, 12
  • 19. Parallel Arrays Un gatito muere en algun lugar cuando: Se accede a una colección not-thread-safe desde un método “parallel” Se crea una closure con estado. Todas las closures que se pasan como parametro a un método paralelo deben de ser thread-safe o dicho de otro modo deben ser “sin estado” Wednesday, May 30, 12
  • 20. Parallel Arrays def findAllPeopleNameOver30AndSingle(people){ def result = [] ParallelEnhancer.enhanceInstance(people) people. findAllParallel{it.age > 30}. eachParallel{ result << it.name} result } Miaoooouuuu Wednesday, May 30, 12
  • 22. Map/Reduce La DSL Map/Reduce para el manejo de colecciones da a GPars un sabor más “funcional”. Map/Reduce “rinde más rápido” que los métodos xxxParallel para operaciones encadenadas sobre una coleccion paralela Algunos métodos map/reduce se pueden usar de la misma manera que los metodos xxxParallel ya que tienen semanticas parecidas Wednesday, May 30, 12
  • 23. Map/Reduce def findAllPeopleNameOver30AndSingle(people){ ParallelEnhancer.enhanceInstance(people) people.parallel. filter{it.age > 30}. map{it.name}.collection } Wednesday, May 30, 12
  • 24. Map/Reduce Cada ejecución xxxParallel hace la conversión paralela-->normal para cumplir con el contrato de los métodos no paralelos. Los métodos Map/Reduce se ejecutan sobre una la colección paralela. Usamos la propiedad parallel para acceder a ella. Los métodos Map/Reduce devuelven una colección paralela. Cuando queramos que devuelvan una colección normal utilizamos la propiedad collection Wednesday, May 30, 12
  • 25. Map/Reduce soccerDays.parallel. filter{it.fieldViewers > 1000000}. map{[it,(it.soccerPlayers / it.fieldViewers) * 100]}. filter{it[1] > 0.018}. map{it[0].day}.collection Wednesday, May 30, 12
  • 26. Ejecución asincrona Combinar la ejecución asincrona de varias tareas y pasarlas como argumentos a otras funciones Hay tareas que se pueden descomponer en varias subtareas más sencillas Mientras que habrá subtareas que tarden en ejecutarse, puede que otras solo tarden un momento Si ejecutaramos secuencialmente las tareas, las pesadas bloquearian a las ligeras. Wednesday, May 30, 12
  • 27. Ejecución asincrona Ejemplo: Media Aritmetica Composición de closures: Hay que dividir la computación del problema en diferentes closures La ejecución de cada closure por separado es inmutable, no depende de los datos de la otra Se combinaran en una tercera closure que cordinará los resultados de ambas Wednesday, May 30, 12
  • 28. Ejecución asincrona def peopleYears = {people-> people*.age.sum()}.asyncFun() def howManyPeople = {people-> people.size()}.asyncFun() def avg = {yearsSum,peopleSize-> yearsSum/peopleSize }.asyncFun() avg( peopleYears(people), howManyPeople(people) ) Wednesday, May 30, 12
  • 29. Conceptos a nivel de arquitectura Wednesday, May 30, 12
  • 30. Concetos a nivel... En esta parte veremos partes de GPars más avanzadas que requieren que planteemos nuestra aplicación de otra manera Dataflow Actores Wednesday, May 30, 12
  • 31. Dataflow GPars nos permite definir procesos como un flujo de datos en lugar de como un flujo de ejecución Se genera un arbol de dependencias entre datos Wednesday, May 30, 12
  • 32. Dataflow Upps... Wednesday, May 30, 12
  • 33. Dataflow result top states rows Esto esta mejor... Wednesday, May 30, 12
  • 34. Dataflow Demo: Tornados en Estados Unidos Recuperamos todos los ocurridos (rows) Recuperamos el maestro de estados (states) Recogemos los 3 más peligrosos (result) Recogemos los nombres (result) Contabilizamos fecha de finalización (end) Wednesday, May 30, 12
  • 35. Dataflow def flow = new Dataflows() task { 1) flow.rows = getTornadoRows() flow.remoteData = getSimulatedDataFromARemoteHost() } 2) task {flow.states = getStateRows()} 3) task {flow.top = ... } task { flow.result = flow.top.collect{data-> 4) flow.states.find{s-> s.stateCode == data.stateCode}.stateName } flow.end = System.currentTimeMillis() } Wednesday, May 30, 12
  • 36. Dataflow Flow: 1) Se descargan los datos de los tornados y unos datos remotos (Estos ultimos hacen esperar un poco el proceso) 2) Esta tarea como no tiene ninguna dependencia se ejecuta a la vez que la tarea uno evitando la espera del proceso remoto 3) Se ejecuta cuando se han resuelto las variables de la tarea 1 4) Se ejecuta cuando se han resuelto las variables de las tareas 2 y 3 (flow.top y flow.states) Wednesday, May 30, 12
  • 37. Dataflow Solución bastante elegante estableciendo dependencias entre datos Cuidado con las dependencias circulares == deadlock No lo recomiendo para arboles “muy grandes”. Se pierde el objetivo y se puede acabar en el punto anterior. Wednesday, May 30, 12
  • 39. Actors NO ESTOS NO Wednesday, May 30, 12
  • 40. Actors Los actores nos permiten la cordinación explicita entre procesos asincronos. Recomendado para tareas complejas con dependencias de paso de mensajes entre ambas. Simula el paradigma de envio de mensajes (send,reply) Wednesday, May 30, 12
  • 41. Actors Inspirado en los Actores de Scala pero mejorado. Actores con estado: Solo en casos concretos Actores sin estado: recomendados Wednesday, May 30, 12
  • 42. Actors Demo: F1 Tenemos una serie de corredores cuyos coches tienen que notificar a direccion de carrera su posición. Actores implicados Conductores: Notifican su posición Comisario de carrera: Notifica el estado de la carrera Wednesday, May 30, 12
  • 43. ¿Para qué podemos usarlo? Wednesday, May 30, 12
  • 44. ¿Para qué? Ideal para: Procesos de calculo matemático Procesos en arbol con nodos inmutables pero dependientes como por ejemplo: Ejemplo: Media aritmetica. La suma de elementos me la da un servicio que tarda x, pero mientras espero puedo calcular el numero total de elementos. En general procesos en los que tienes que componer datos dependiendo de otros que provinenen de diferentes fuentes heterogeneas y con alta latencia. Wednesday, May 30, 12
  • 45. ¿Para qué? Ideal para: Programación funcional (Map/Reduce) Programación orientada a eventos (Actores) Wednesday, May 30, 12
  • 46. GPars es mucho más Agents Speculations STM (Software Transactional Memory) ... Wednesday, May 30, 12
  • 47. GPars es mucho más Página proyecto http://gpars.codehaus.org/ Libros Groovy In Action (2nd Ed) (Contiene un capítulo dedicado unicamente a GPars) Wednesday, May 30, 12
  • 48. GPars es mucho más Blogs, videos... Paul King (Video) GPars Concurrency http://www.youtube.com/watch?v=dUDKnIIWw48 Tomas Lin: Grails/Gorm con GPars http://fbflex.wordpress.com/2010/06/11/writing-batch-import-scripts-with- grails-gsql-and-gpars/ Arturo Herrero (Slide) Functional Groovy http://www.slideshare.net/arturoherrero/functional-programming-with-groovy Wednesday, May 30, 12