SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
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

Contenu connexe

Plus de 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
 

Plus de 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
 

Dernier

GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 

Dernier (20)

GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 

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