groovy at canoo - bed-con.orgbed-con.org/2012/files/slides/bed-con_gpars_2011.pdf · open-source...

26
Dierk König Canoo Engineering AG Basel, Schweiz Multi-core für jedermann mit GPars Berlin Expert Days 2012

Upload: others

Post on 18-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Dierk KönigCanoo Engineering AG

Basel, Schweiz

Multi-core für jedermann

mit GPars

Berlin Expert Days2012

Page 2: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Welcome!Dierk KönigFellow @ Canoo Engineering AG, Basel (CH)

Rich Internet ApplicationsProducts, Projects, Consultingwww.canoo.com

Open-source committer Groovy, Grails, GPars

Page 3: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Groovy & GPars mission

3

1 Built for Java developers

Mend with Java

Make concurrency simpler

2

3

Page 4: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

The Java state of affairs

Starting new threads is easy.Some real goodies in java.util.concurrent.* & Java 7

Manual thread-coordination is difficult.Access to shared state is error-prone.

Scheduling issues for many threads with badconcurrency characteristics.Good use of pooling is not obvious.Concepts are rather „low level“.

4

Page 5: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

It‘s all about coordination

Fork/JoinMap/Reduce

Actor AgentDataflow

Working on collections with fixed coordination

Explicit coordinationDelegated coordinationImplicit coordination

1.8.2

Page 6: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

It‘s all about coordination

Fork/JoinMap/Reduce

Actor AgentDataflow

Asynchronizer

STM

more

Working on collections with fixed coordination

Explicit coordinationDelegated coordinationImplicit coordination

1.8.2

Page 7: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Fork/Join on collections

import static groovyx.gpars.GParsPool.withPool

def numbers = [1, 2, 3, 4, 5, 6]def squares = [1, 4, 9, 16, 25, 36]

withPool { assert squares == numbers.collectParallel { it * it }}

// in reality, find better chunks of work!

6

Page 8: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Fork/Join on collections

import static groovyx.gpars.GParsPool.withPool

def numbers = [1, 2, 3, 4, 5, 6]def squares = [1, 4, 9, 16, 25, 36]

withPool { assert squares == numbers.collectParallel { it * it }}

// in reality, find better chunks of work!

6

makeConcurrent()Variation

Page 9: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

More such methods

any { ... } collect { ... } count(filter) each { ... } eachWithIndex{ ... } every { ... } find { ... } findAll { ... } findAny { ... } fold { ... } fold(seed) { ... } grep(filter) groupBy { ... } max { ... } max() min { ... } min() split { ... } sum()

7

Page 10: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Map/Filter/Reduce on collectionsimport static groovyx.gpars.GParsPool.withPool

withPool { assert 55 == [0, 1, 2, 3, 4].parallel .map { it + 1 } .map { it ** 2 } .reduce { a, b -> a + b }}

8

Page 11: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Fork/Join vs Map/Filter/Reduce

9

!

Page 12: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Fork/Join vs Map/Filter/Reduce

9

!

fixed coordination

Page 13: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Explicit coordination with Actors

import static groovyx.gpars.actor.Actors.*

def printer = reactor { println it }def decryptor = reactor { reply it.reverse() }

actor { decryptor.send 'lellarap si yvoorG' react { printer.send 'Decrypted message: ' + it decryptor.stop() printer.stop() }}.join()

10

Page 14: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Actors

Process one message at a time.

Dispatch on the message type, which fits nicely with dynamic languages.

Are often used in composition,which can lead to further problems down the road.

11

Personal note:

Actors are overrated

Page 15: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Delegate to an Agent

import groovyx.gpars.agent.Agent

def safe = new Agent<List>( ['GPars'] )

safe.send { it.add 'is safe!' }safe.send { updateValue it * 2 }

println safe.val

12

Page 16: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Agents

Analogous to Clojure agents (atoms, refs, ...)

Implementations differ much in efficiency.

13

Page 17: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

DataFlow for implicit coordination

import groovyx.gpars.dataflow.Dataflowsimport static groovyx.gpars.dataflow.Dataflow.task

final flow = new Dataflows()task { flow.result = flow.x + flow.y }!task { flow.x = 10 }! ! !task { flow.y = 5 }! ! !

assert 15 == flow.result!

14

Page 18: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Dataflow

Flavors: variables, streams, operators, tasks, flows

Write-Once, Read-Many (non-blocking)

Feel free to use millions of them

Fast, efficient, safe, and testable!

15

Model the flow of data,

not the control flow!

Page 19: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

KanbanFlow in code

import static ProcessingNode.nodeimport groovyx.gpars.kanban.KanbanFlow

def producer = node { below -> below << 1 }def consumer = node { above -> println above.take() }

new KanbanFlow().with { link producer to consumer start() links*.addTray() // run for a while stop()}

16

Page 20: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Efficient Producer-Consumer

KanbanFlow pattern by /me

http://people.canoo.com/mittie/kanbanflow.html

Simple idea, amazing results

Resource efficient, composable, testable

17

Non-blocking writes,

Deadlock-free by design

Page 21: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Takeaways

18

1 Experiment with GPars!

Great for learning concepts!

Get involved!

2

3

Page 22: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Further reading

• Groovy in Action groovy.canoo.com/gina Manning, 2007, Foreword by James GoslingKönig with Glover, Laforge, King, Skeet

• groovy.codehaus.orggpars.codehaus.org

Page 23: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

20

Page 24: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

20

Page 25: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Discussion

credits: Paul King

Page 26: Groovy at Canoo - bed-con.orgbed-con.org/2012/files/slides/BED-CON_GPars_2011.pdf · Open-source committer Groovy, Grails, GPars. Groovy & GPars mission 3 1 Built for Java developers

Discussion

credits: Paul King

[email protected]@mittie