370

# Grokking Coroutines (MinneBar)

What are coroutines, really?

Given at MinneBar 2020.

October 13, 2020

## Transcript

4. ### sequence { var cur = 1 var next = 1

while (true) { yield(cur) val tmp = cur + next cur = next next = tmp } }

6. ### Subroutines fun sumSquaredValues(values: List<Int>): Int { return values.sumBy { value

-> square(value) } } fun square(value: Int): Int = value * value

9. ### val iterator = sequence.iterator() while (iterator.hasNext()) { val next =

iterator.next() println(next) } sequence { var cur = 1 var next = 1 while (true) { yield(cur) val tmp = cur + next cur = next next = tmp } } Consumer Producer
10. ### val iterator = sequence.iterator() while (iterator.hasNext()) { val next =

iterator.next() println(next) } sequence { var cur = 1 var next = 1 while (true) { yield(cur) val tmp = cur + next cur = next next = tmp } } Consumer Producer
11. None
12. ### class Fibonacci { var cur = 1 var next =

1 fun next(): Int { val toReturn = cur val tmp = cur + next cur = next next = tmp return toReturn } } sequence { var cur = 1 var next = 1 while (true) { yield(cur) val tmp = cur + next cur = next next = tmp } } Versus
13. ### Multiple Suspend Points sequence { yield(1) // first Fibonacci number

var cur = 1 var next = 1 while (true) { yield(next) // next Fibonacci number val tmp = cur + next cur = next next = tmp } }

15. ### Why use coroutines? • Another tool for writing good code

• Two ways to use tool: • Code Structure • Concurrency

18. ### Blocking Functions fun main() { print(calculateMeaningOfLife()) } fun calculateMeaningOfLife(): Int

{ // Calculates for 7.5 million years, then... return 42 }

return 42 }
20. ### Blocking vs. Nonblocking Blocking Blocked During I/O Non-Blocking Waiting During

I/O Doing other work

{ joinAll( async { doSomething("First", 10) }, async { doSomething("Second", 5) } ) } suspend fun doSomething(name: String, delay: Long) { println("\$name START (\${Thread.currentThread().name})") delay(delay) println("\$name END (\${Thread.currentThread().name})") } First START (main) Second START (main) Second END (main) First END (main)

23. ### Callback Hell requestRandomUrl { url -> downloadImage(url) { image ->

displayImage(image) } } myScope.launch { val url = requestRandomUrl() val image = downloadImage(url) displayImage(image) } Vs
24. ### Why use coroutines? • Concurrency • Coroutines *are* like light-weight

threads! • …In any language! • Code Structure • Coroutines enable simpler code

28. ### Stdlib Basics • Suspending functions • A way to start

suspending functions • Contexts

30. ### Start Suspending Functions suspend fun mySuspendingFunction() fun <T> (suspend ()

-> T).startCoroutine(completion: Continuation<T>) fun main() { ::mySuspendingFunction.startCoroutine( Continuation(EmptyCoroutineContext) { } ) }
31. ### Coroutine Context • Store useful info about coroutine • Dispatcher

• Job • Debug info