Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Coroutines in Kotlin

Coroutines in Kotlin

Slides from my talk at Kotlin TechTalks@Lohika Kyiv, 2017-09-20

Dmytro Zaitsev

September 20, 2017
Tweet

More Decks by Dmytro Zaitsev

Other Decks in Programming

Transcript

  1. v1: Sequential fun postItem(item: Item) {
 val token = prepareToken()

    / / 1
 val post = submitPost(token, item) / / 2
 processPost(post) / / 3
 }
  2. v2: Async callbacks fun postItem(item: Item) {
 prepareTokenAsync { token

    -> / / 1
 submitPostAsync(token, item) { post -> / / 2
 processPost(post) / / 3
 }
 }
 }
  3. v3: Reactive fun postItem(item: Item) {
 observeToken()
 .concatMap { token

    -> observePost(token, item) }
 .subscribe { post -> processPost(post) }
 }
  4. v4: Coroutines fun postItem(item: Item) {
 launch(CommonPool) {
 val token

    = prepareToken() / / 1
 val post = submitPost(token, item) / / 2
 processPost(post) / / 3
 }
 }
  5. A coroutine is… an instance of suspendable computation similar to

    a daemon thread, but very light-weight similar to a future or promise
  6. Why coroutines? threads are expensive to keep and switch your

    code is single threaded you’ve got lots of mutable states
  7. Standard API • Language support (`suspend` keyword) • low-level basic

    API (stdlib: kotlin.coroutines) • high-level APIs that can be used in user code
  8. Low-level API (kotlin.coroutines) • kotlin.coroutines.experimental • create/start/suspendCoroutine() • Continuation interface

    • @RestrictSuspension annotation • kotlin.coroutines.experimental.intrinsics • suspendCoroutineOrReturn()
  9. buildSequence {
 print("Start")
 yield(1) / / suspension point
 
 var

    prev = 0
 var cur = 1
 while (true) {
 print(“Next") val next = prev + cur
 yield(next) / / suspension point
 
 prev = cur
 cur = next
 }
 print("End") / / unreachable code
 }.take(8).forEach { print(" $it ") }
 / / Output: Start 1 Next 1 Next 2 Next 3 Next 5 Next 8 Next 13 Next 21
  10. kotlinx.coroutines • kotlinx-coroutines-core • integration • guava, jdk8, nio, quasar

    • reactive • reactive, reactor, rx1, rx2 • ui • android, javafx, swing
  11. Job states State isActive isCompleted isCancelled New - - -

    Active + - - Completed - + - Cancelling - - + Cancelled - + +
  12. val deferred = async(CommonPool) {
 throw SomeException("I'm thrown inside a

    coroutine")
 }
 try {
 deferred.await() / / re-throws
 } catch (e: SomeException) {
 log(e.message)
 } Exception handling
  13. WeakReference “life hack” suspend operator fun <T> WeakReference<T>.invoke(): T =

    suspendCoroutineOrReturn { get() ?: throw CancellationException() } val activityRef = WeakReference(this)
 launch(CommonPool) {
 activityRef().expensiveComputation()
 }
  14. Links Andrey Breslav FAQ:
 https:/ /discuss.kotlinlang.org/t/experimental-status-of-coroutines-in-1-1-and- related-compatibility-concerns/2236 Design document (KEEP):


    https:/ /github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines- informal.md Full kotlinx.coroutines API:
 http:/ /kotlin.github.io/kotlinx.coroutines Coroutines guide by Roman ELizarov:
 https:/ /github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md