SlideShare ist ein Scribd-Unternehmen logo
11
Nebenläufigkeit
mit Kotlins Koroutinen
Jörn Dinkla, para//el 2019
● Nebenläufigkeit kann kompliziert sein
● Kotlins Ansatz:
○ Koroutinen
● Kotlin ist relativ neue Sprache
○ Pragmatisch
○ Besser als Java
○ Schneller und einfacher als Scala
Einleitung
2
Jörn Dinkla
3
Software-Entwickler und Berater
● JVM (z. B. Kotlin, Clojure, Java), React, C++
● Konferenzen & Artikel
● GPU-Computing, Machine Learning
jdinkla@thoughtworks.com
http://www.dinkla.net
Folien: https://www.slideshare.net/dinkla
Code: https://github.com/jdinkla/parallel2019-kotlins-koroutinen
4
“A community of passionate individuals
whose purpose is to revolutionize
software design, creation and delivery,
while advocating for positive social change.”
We are
hiring ...
Fragen an das Publikum
5
Sprachen
● JVM vs. C++ vs. ?
Nebenläufigkeit
● Erfahrung mit Threads oder Futures ?
6
2004 2007 20192001 2010 2013 2016
Java 9
Reactive
2017
Java 7
Fork/Join
2011
Java 8
Streams
CmplFut
2014
Java 5
2004
Nebenläufigkeit
Java 1
1995
C++ 11
thread
2011
C++ 14
mutex
2014
C++ 17
par STL
2017
Kotlin
1.0
2016
Kotlin
1.3
2018
7© https://www.flickr.com/photos/dougtone/
Kotlin
Kotlin
8
● Interoperabel mit Java
● Objektorientiert
○ Klassen, Null-sichere Typen
● Funktional
○ Higher-Order-Funktionen, Lambdas
● Ausdrucksstark
○ DSLs und Builder-Pattern
○ Koroutinen als DSL implementiert
Multi-Plattform
9
● Kotlin for JVM
● Kotlin for Android
● Kotlin JavaScript
● Kotlin Native
○ iOS, Android
○ MacOS, Linux
○ WebAssembly
https://twitter.com/DCKotlin/status/1049279123208773632
Bekannte Benutzer von Kotlin
10
● First-class support for Android
● Gradle hat Kotlin-DSL
● ca. 25% der Top500-Apps im Android-Store
○ https://www.appbrain.com/stats/libraries/details/kotlin/kotlin
Warum Kotlin?
11
https://pusher.com/state-of-kotlin
!
Koroutinen in Kotlin
12
● Ziel
○ Minimale Änderung der Sprache
○ Delegation in Bibliotheken
● Vorbild
○ Java-Collections im Kotlin-SDK
○ Nur Erweiterung des Java-SDKs
○ Keine eigenen Klassen hinzugefügt
Kotlin-Trick #1: “extension function”
13
String!
Kotlin-Trick #2: Funktion als letzter Parameter
14
Kotlin-Trick #3: “lambda with receiver”
15https://kotlinlang.org/docs/reference/lambdas.html#function-literals-with-receiver
Interne
DSL
Hello World mit Koroutinen
16
Hello World mit Koroutinen
17
●
○ Startet
○ Wartet auf alle Koroutinen
●
○ Startet Koroutine
●
○ Analog
18
Beispielanwendung
Verzögerter Web-Server
GET-Request …
http://localhost:9090/${MS}/${URI}
… wartet MS Millisekunden und liefert die Seite URI zurück.
Beispiel:
http://localhost:9090/1500/https://www.parallelcon.de/
19
Algorithmus
Wiederhole
1. Falls neuer Request auf Port P
a. Lies MS und URI aus Eingabe
b. Warte MS
c. Hole Seite von URI
d. Schreibe diese in Ausgabe
Frage: Wenn Wartezeit sehr lang, ist Programm blockiert?
20
Prozess im Betriebssystem
21
● Verwaltung von OS-Ressourcen
○ Speicher
○ IO-Deskriptoren
Berühmtes Beispiel: Unix-Pipes aus 70ern
Bild: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/images/Chapter4/4_01_ThreadDiagram.jpg
Thread im Betriebssystem
● Prozess: 1..* Threads
● Teilen sich Ressourcen
● Gemeinsamer Adressraum
● Parallelität innerhalb Prozess
Ein Thread ist ein leichtgewichtiger Prozess.
22Bild: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/images/Chapter4/4_01_ThreadDiagram.jpg
Thread in JVM
23
● Java entspricht OS-Thread
● OS macht Scheduling
● 1 Thread benötigt ca. 2MB an Speicher
● JVM hat eigene Threads
○ Z. B. Garbage Collection
http://blog.jamesdbloom.com/JVMInternals.html
24
Utils
Java11
HttpClient
Thread-Pools
● Statt immer neue Threads zu erstellen
● Menge von wartenden Threads bereit halten
●
● Verschiedene Arten
○ ,
○
○
25
Thread-Pool in Kotlin
26
Performance-Test
27
● nginx in Docker-Container [Port 8080]
● Beispielanwendung [Port 9090]
● loadtest (node/npm)
https://www.npmjs.com/package/loadtest
Performance des Thread-Pools
28
Zu wenig
Threads
Arten der Auslastung
29
● Computation bound, CPU-bound
○ Prozessor 100% ausgelastet
● IO bound
○ Latency bound
■ Warten auf die Daten
○ Memory bound
■ Bandbreite zum Speicher ausgelastet
Optimale Größe des Thread-Pools
30
Latenz ist der limitierende Faktor
31
Auslastung Thread-Diagramm
32
Web-Server [Main-Thread]
Handler [Thread] Handler [Thread]
F J
Start Ende
F J
Nginx NginxWartet Wartet
33
To block or not to block ...
Alle Räder stehen still, ...
34
● Blockierender IO:
○ Thread wartet bis Ergebnis zurückgeliefert wird
○ Thread “blockiert”
● Pool mit k Threads und k blockierenden Threads
○ Wartet nur noch
○ CPU-Auslastung sinkt
Lösung: Asynchronität
35
● Rufe Funktion nebenläufig auf
○ In der Zwischenzeit erledige andere Dinge
● Lösungsansätze
○ Callbacks
○ Futures, Promises, Deferred
○ Streams
○ Reaktive Programmierung: Observables, Flux
○ Koroutinen
Future, Promises und Deferred
36
● Ergebnis kommt zu späterem Zeitpunkt
● ist Interface seit Java 5
○ Viele Implementierungen
○ in Java 8
● Beispiel:
Asynchroner GET-Aufruf
37
Chaining
Nachteile
38
● Invasive Syntax
○ Funktions-Signaturen ändern sich
● Chaining
○ Erzeugt zwei Ebenen
○ Ändert Code stark
○ Nicht einheitlich über Bibliotheken hinweg
Future sind nicht die Lösung!
https://blog.jetbrains.com/kotlin/2018/10/kotlin-1-3/
Was sind Koroutinen?
40
Threads sind leichtgewichtige Prozesse.
Was sind Koroutinen? Leichtgewichtige Threads?
Zur Beantwortung dieser Frage weitere Grundlagen
erforderlich.
Hello World Revisited:
41
● Letzter Parameter ist Lambda mit Receiver
● Was ist ?
Was ist ?
42
● Einziges neues Keyword
● Unterbrechbare Funktion oder Lambda
○ Aufrufbar nur von unterbrechbarer Funktion oder
Koroutine
● Bei “suspension points” gibt der Koroutinen-Dispatcher
die Kontrolle an andere Koroutinen
Refactoring:
43
Koroutinen-Builder:
44
● erstellt einen
● cancel()
● join()
Koroutinen-Builder:
45
● erstellt ein
Refactoring:
46
Structured Concurrency mit
47
● Platz für Extensionsfunktionen
○ Z. B. die Koroutinen-Builder
● Jeder Builder erstellt neuen Scope mit neuer Job-Instanz
○ Koroutinen bilden eine Hierarchie
○ Flexibel: z. B.
● Builder für “parallel decomposition”
● Hat einen
CoroutineContext
48
● Hierarchie von Koroutinen
● Cancel-ability
○ Kooperation für Canceln notwendig mit
● Exception-Handling
○ Für ’s und ’s unterschiedlich
● …
○ Ruft block mit Kontext auf, suspended bis fertig
● Dispatcher und Thread-Pool
49
50
51
●
○ CPU-Bound: Anzahl der Kerne inkl. Hyper-Threading
●
○ max(64, #CPUs),
●
○ Single-Thread für UI
52
Wie es funktioniert ...
Continuation-Passing-Style (CPS)
53
● Jede “suspending”-Funktion ...
○ Erhält eine
○ “Callback”, der am Ende aufgerufen wird 1991
Implementierung
54
● Jede “suspending”-Funktion ...
○ wird in endlichen Automaten transformiert
■ Zustände: Anfang und “suspension points”
https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md
Kotlin Evolution and Enhancement Process
Endlicher Automat
55
56
Zusammenfassung: Koroutinen-Architektur
● Netzwerk von unterbrechbaren Funktionen
● Merken sich Zustand und Wiederaufsetzpunkte
● Bei “Suspension points” kommt Dispatcher ins Spiel
● bestimmt Thread aus Pool und
Koroutine
57
Threads sind leichtgewichtige Prozesse.
Koroutinen sind sehr leichtgewichtige Threads?
Auch überrascht?
58
Koroutinen sind eher ein raffinierter Trick ...
… und haben andere Eigenschaften als Threads.
Asynchroner verzögerter Web-Server
59
Wie mit Koroutinen entwickeln?
60
Pattern und “Best practices”:
● Müssen noch für die Koroutinen entwickelt werden
● Sind noch nicht endgültig
Hoffentlich in der nahen Zukunft:
● Bibliotheken unterstützen die Koroutinen nativ
● Keine (Umwandlung von) CompletableFutures mehr
Ktor
61
● Framework für asynchrone Services
● Benutzt Koroutinen
● Asynchroner IO als Default
● Server und Clients
● DSL für Routes
● Flexibel, vielseitige “Plug-In”-Möglichkeiten
https://ktor.io/
https://github.com/ktorio/ktor
Server mit Ktor
62
CIO-HttpClient
63
64
Modelle der Nebenläufigkeit
Ermöglichen neue Nebenläufigkeits-Modelle
65
Alternative Modelle
● Neue Pattern mit Koroutinen
● Message-Passing, CSP
● Aktoren
Lazy-Listen mit Generatoren
66
Channels
67
● CPS, Message-Passing und Aktoren
● Channel zum Lesen und Schreiben
○ send() ist suspending
● Verschiedene Arten
○ Buffer-Channel, z. B. mit Backpressure
○ Rendezvous-Channel
■ Suspend des Senders, bis retrieved()
Beispiel für Channel
68
Produzenten
69
Aktoren
Kommunikation über Nachrichten
Aktor besteht aus
● Koroutine
● Zustand
● Channel
70
71
72
Fazit
Fazit
73
● Alles bleibt beim alten, bis auf Schlüsselwort
Daher
● Sequentiell per Default
● Nebenläufig explizit durch angegeben
● Minimal-invasive Syntax
● Gute Integration in bisherigen Code
● Funktionen können normal verwendet werden
Fazit
74
Koroutinen sind keine leichtgewichtige Threads.
● Koroutinen sind eigenständiges Modell der
Nebenläufigkeit
● Ermöglichen Modelle jenseits von Threads und Futures
● Können zu modularen, wartbaren und einfach zu
verstehenden Code führen
● Benötigen Einarbeitungszeit und Experimente
● Viele Bibliotheken müssen noch suspend-able werden
Weiterführendes
75
Kotlin lernen und ausprobieren
Informationen
● https://kotlinlang.org/
Ausprobieren im Browser
● https://play.kotlinlang.org
Koans
● https://play.kotlinlang.org/koans/overview
76
Koroutinen
77
● Roman Elizarov’s Blog
○ Team-Lead für Kotlin-Bibliotheken
○ https://medium.com/@elizarov
○ https://www.youtube.com/watch?v=hb0hfHVWCS0
● Dokumentation
○ https://kotlinlang.org/docs/reference/coroutines-overview.html
● Beispiele
○ https://github.com/Kotlin/kotlin-coroutines-examples/tree/master/exam
ples
Literatur
78
Vielen Dank für Ihre Aufmerksamkeit
79

Weitere ähnliche Inhalte

Ähnlich wie Nebenläufigkeit mit Kotlins Koroutinen

Microservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSMicroservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OS
Ralf Ernst
 
Python Academy
Python AcademyPython Academy
Python Academy
rocketcircus
 
Puppet - Entwicklungsworkflow und Basismodule
Puppet - Entwicklungsworkflow und BasismodulePuppet - Entwicklungsworkflow und Basismodule
Puppet - Entwicklungsworkflow und Basismodule
inovex GmbH
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
QAware GmbH
 
Puppet: Designing modules & repositories
Puppet: Designing modules & repositoriesPuppet: Designing modules & repositories
Puppet: Designing modules & repositories
inovex GmbH
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Jörn Dinkla
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Torsten Kleiber
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
Sascha Koch
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance Reloaded
Gregor Goldbach
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Gregor Biswanger
 
EntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloadedEntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloaded
René Winkelmeyer
 
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in RubyPerformanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
vesparun
 
Ruby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerRuby und Rails für .NET Entwickler
Ruby und Rails für .NET Entwickler
NETUserGroupBern
 
Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020
Torsten Kleiber
 
Oracle vs. PostgreSQL - Unterschiede in 45 Minuten
Oracle vs. PostgreSQL - Unterschiede in 45 MinutenOracle vs. PostgreSQL - Unterschiede in 45 Minuten
Oracle vs. PostgreSQL - Unterschiede in 45 Minuten
Markus Flechtner
 
Oracle und Docker
Oracle und DockerOracle und Docker
Oracle und Docker
Stefan Oehrli
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
Odilo Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
Patrick Baumgartner
 
oVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und EvaluierungsergebnisseoVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und Evaluierungsergebnisse
inovex GmbH
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
André Krämer
 

Ähnlich wie Nebenläufigkeit mit Kotlins Koroutinen (20)

Microservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSMicroservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OS
 
Python Academy
Python AcademyPython Academy
Python Academy
 
Puppet - Entwicklungsworkflow und Basismodule
Puppet - Entwicklungsworkflow und BasismodulePuppet - Entwicklungsworkflow und Basismodule
Puppet - Entwicklungsworkflow und Basismodule
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
 
Puppet: Designing modules & repositories
Puppet: Designing modules & repositoriesPuppet: Designing modules & repositories
Puppet: Designing modules & repositories
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance Reloaded
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
EntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloadedEntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloaded
 
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in RubyPerformanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
 
Ruby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerRuby und Rails für .NET Entwickler
Ruby und Rails für .NET Entwickler
 
Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020
 
Oracle vs. PostgreSQL - Unterschiede in 45 Minuten
Oracle vs. PostgreSQL - Unterschiede in 45 MinutenOracle vs. PostgreSQL - Unterschiede in 45 Minuten
Oracle vs. PostgreSQL - Unterschiede in 45 Minuten
 
Oracle und Docker
Oracle und DockerOracle und Docker
Oracle und Docker
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
 
oVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und EvaluierungsergebnisseoVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und Evaluierungsergebnisse
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
 

Mehr von Jörn Dinkla

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
Jörn Dinkla
 
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Jörn Dinkla
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?
Jörn Dinkla
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to Kotlin
Jörn Dinkla
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutines
Jörn Dinkla
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
Jörn Dinkla
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Jörn Dinkla
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Jörn Dinkla
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer Überblick
Jörn Dinkla
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Jörn Dinkla
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Jörn Dinkla
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
Jörn Dinkla
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel Computing
Jörn Dinkla
 
Subversion Schulung
Subversion SchulungSubversion Schulung
Subversion Schulung
Jörn Dinkla
 
Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4
Jörn Dinkla
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
Jörn Dinkla
 

Mehr von Jörn Dinkla (16)

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
 
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to Kotlin
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutines
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer Überblick
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel Computing
 
Subversion Schulung
Subversion SchulungSubversion Schulung
Subversion Schulung
 
Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
 

Nebenläufigkeit mit Kotlins Koroutinen