Slide 1

Slide 1 text

#codetalkshh New Concurrency Models on the JVM Lutz Hühnken http://www.huehnken.de | @lutzhuehnken

Slide 2

Slide 2 text

#codetalkshh Warum ist Concurrency überhaupt interessant? 2

Slide 3

Slide 3 text

#codetalkshh Hardware ist parallel. 3

Slide 4

Slide 4 text

#codetalkshh Wir finden sequentiell einfach. 4

Slide 5

Slide 5 text

#codetalkshh 5

Slide 6

Slide 6 text

#codetalkshh 6

Slide 7

Slide 7 text

#codetalkshh 7

Slide 8

Slide 8 text

#codetalkshh 8

Slide 9

Slide 9 text

#codetalkshh Wie sieht es denn heute aus? Threads. 9

Slide 10

Slide 10 text

#codetalkshh Problem 1: Effizienz 10

Slide 11

Slide 11 text

#codetalkshh 11

Slide 12

Slide 12 text

#codetalkshh 12 1 2 3 … 10.000

Slide 13

Slide 13 text

#codetalkshh 13 Source: John Rose, Java VM Architect, JFokus, Stockholm, February 2015

Slide 14

Slide 14 text

#codetalkshh Lösung Effizienz: • Sub-Thread-Level Concurrency • Asynchrone I/O
 • Das ist allen den folgenden Ansätzen gemeinsam!
 • Das ist allen „Reactive Systems“ gemeinsam! 14

Slide 15

Slide 15 text

#codetalkshh Problem 2: Programmiermodell 15

Slide 16

Slide 16 text

#codetalkshh 16 They discard the most essential and appealing properties of sequential computation: understandability, predictability, and determinism. Threads, as a model of computation, are wildly nondeterministic, and the job of the programmer becomes one of pruning that nondeterminism.

Slide 17

Slide 17 text

#codetalkshh Was interessiert uns denn? Zustand Komposition Interoperation 17

Slide 18

Slide 18 text

#codetalkshh 18 Green Threads (User Mode Threads, Fibers) Quasar Agenten Clojure Communicating Sequential Processes (CSP) Clojure Event Bus vert.x Aktoren Akka Programmiermodelle

Slide 19

Slide 19 text

#codetalkshh Fibers new Fiber() { @Override protected V run() throws SuspendExecution, InterruptedException { // code hier } }.start(); 19

Slide 20

Slide 20 text

#codetalkshh Fibers Vorteil: Imperative Programmierung, wie mit Threads Nachteil: Imperative Programmierung, wie mit Threads 20

Slide 21

Slide 21 text

Reactive Slick Warum ist asynchrone I/O so wichtig? Threads als kleinste Einheit der Nebenläufigkeit 21 Wichtig: Dies ist eine Momentaufnahme, kein Ablauf

Slide 22

Slide 22 text

Reactive Slick Warum ist asynchrone I/O so wichtig? Threads als Vehikel für kleinere Einheiten (z.B. Fibers) 22 Wichtig: Dies ist eine Momentaufnahme, kein Ablauf

Slide 23

Slide 23 text

#codetalkshh Einschub: Callback Hell fs.readdir(source, function(err, files) { if (err) { console.log('Error finding files: ' + err) } else { files.forEach(function(filename, fileIndex) { console.log(filename) gm(source + filename).size(function(err, values) { if (err) { console.log('Error identifying file size: ' + err) } else { console.log(filename + ' : ' + values) aspect = (values.width / values.height) widths.forEach(function(width, widthIndex) { height = Math.round(width / aspect) console.log('resizing ' + filename + 'to ' + height + 'x' + height) this.resize(width, height).write(destination + 'w' + width + '_' + filename, function(err) { if (err) console.log('Error writing file: ' + err) }) }.bind(this)) } }) }) } }) 23

Slide 24

Slide 24 text

#codetalkshh Callback Hell Alternativen • Channels (sehen wir noch) • Events oder Messages (sehen wir noch) • Lesbare Syntax für „onComplete“ (z.B. Scala flatMap / for expression) 24

Slide 25

Slide 25 text

#codetalkshh Fibers class FooAsync extends FiberAsync implements FooCompletion { @Override public void success(String result) { asyncCompleted(result); } @Override public void failure(FooException exception) { asyncFailed(exception); } } wird zu String op() { new FooAsync() { protected void requestAsync() { Foo.asyncOp(this); } }.run(); } 25

Slide 26

Slide 26 text

#codetalkshh Fibers •Effizienz ja •Programmiermodell unverändert •Aber: Eine Menge interessanter Tricks (Instrumentation, Continuations, Thread Interop) •Low-level Grundlage für andere Konstrukte •Drop-In Ersatz für Threads 26

Slide 27

Slide 27 text

#codetalkshh Agenten (def x (agent 0)) (defn increment [c n] (+ c n)) (send x increment 5) ; @x -> 5 (send x increment 10) ; @x -> 15 27

Slide 28

Slide 28 text

#codetalkshh Agenten • Der Agent kapselt den Zustand
 • Sende eine Funktion als Nachricht an den Agenten, diese wird asynchron ausgeführt 28

Slide 29

Slide 29 text

#codetalkshh Agenten • Attraktivität: Funktionale Programmierung! (Unveränderliche Werte als Normalfall, veränderlicher Zustand als Ausnahme)
 • Keine Lösung für Komposition, daher ‛ Channels 29

Slide 30

Slide 30 text

#codetalkshh Clojure Channels (def echo-chan (chan)) (go (println (!! echo-chan "ketchup") ; => true ; => ketchup 30

Slide 31

Slide 31 text

#codetalkshh Clojure Channels (def echo-buffer (chan 2)) (>!! echo-buffer "ketchup") ; => true (>!! echo-buffer "ketchup") ; => true (>!! echo-buffer "ketchup") ; blocks 31

Slide 32

Slide 32 text

#codetalkshh Channels • Sehr flexible Komposition • Implementieren Communicating Sequential Processes (Tony Hoare 1978, https:// en.wikipedia.org/wiki/ Communicating_sequential_processes) 32

Slide 33

Slide 33 text

#codetalkshh Event Bus (vert.x) 33 public class Receiver extends AbstractVerticle { @Override public void start() throws Exception { EventBus eb = vertx.eventBus(); eb.consumer("ping-address", message -> { System.out.println("Received message: " + message.body()); // Now send back reply message.reply("pong!"); }); System.out.println("Receiver ready!"); } }

Slide 34

Slide 34 text

#codetalkshh Event Bus (vert.x) 34 Image from Jonas Bandi @jbandi

Slide 35

Slide 35 text

#codetalkshh Event Bus (vert.x) • „Single Thread Illusion“ • Lose Kopplung • Hybrides Thread-Modell • Bonus: Verteilung 35

Slide 36

Slide 36 text

#codetalkshh Aktoren (Akka) 36

Slide 37

Slide 37 text

#codetalkshh Aktoren (Akka) 37

Slide 38

Slide 38 text

#codetalkshh Aktoren (Akka) 38

Slide 39

Slide 39 text

#codetalkshh Aktoren (Akka) 39

Slide 40

Slide 40 text

#codetalkshh Aktoren (Akka) 40

Slide 41

Slide 41 text

#codetalkshh Aktoren (Akka) 41

Slide 42

Slide 42 text

#codetalkshh Aktoren (Akka) • „Single Thread Illusion“ • Messaging, incl. Routing etc. • Dispatcher • Bonus: Verteilung, Supervision 42

Slide 43

Slide 43 text

#codetalkshh 43 Green Threads (User Mode Threads, Fibers) Quasar Agenten Clojure Agents Communicating Sequential Processes (CSP) Clojure Channels Event Bus vert.x Aktoren Akka Programmiermodelle

Slide 44

Slide 44 text

#codetalkshh • Quasar hat auch eine Implementierung von Channels, und sogar Aktoren
 • Mit Akka kann man auch einen Event Bus implementieren, und auch Agenten
 • Es gibt eine Welt außerhalb der JVM (Go Channels, Erlang…)
 • … 44 Der Vollständigkeit halber

Slide 45

Slide 45 text

#codetalkshh • Concurrency ist interessant
 • Threads sind passé, Alternativen sind vorhanden
 • Wenn ihr euch nur eine Alternative anseht, empfehle ich Akka 45 Fazit

Slide 46

Slide 46 text

Vielen Dank Nicht vergessen: Bewertung abgeben (in der App) Lutz Hühnken http://www.huehnken.de | @lutzhuehnken