Coroutines Concepts
Start Coroutine
startCoroutine runs a suspend lambda and reports its result through a continuation.
startCoroutine
`startCoroutine` is a standard-library bridge from a suspend lambda to an explicit continuation callback.
Start Coroutine
StartCoroutine.kt
Replay: real traced execution (multi-file project)
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
suspend fun doubleValue(value: Int): Int {
return value * 2
}
fun main() {
val input = 4
val events = mutableListOf("created")
val work: suspend () -> Int = {
events.add("running")
doubleValue(input)
}
work.startCoroutine(object : Continuation<Int> {
override val context = EmptyCoroutineContext
override fun resumeWith(result: Result<Int>) {
events.add("resumed=${result.getOrThrow()}")
}
})
println("events=" + events.joinToString(">"))
}
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
suspend fun doubleValue(value: Int): Int {
return value * 2
}
fun main() {
val input = 2
val events = mutableListOf("created")
val work: suspend () -> Int = {
events.add("running")
doubleValue(input)
}
work.startCoroutine(object : Continuation<Int> {
override val context = EmptyCoroutineContext
override fun resumeWith(result: Result<Int>) {
events.add("resumed=${result.getOrThrow()}")
}
})
println("events=" + events.joinToString(">"))
}
import kotlin.coroutines.Continuation
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.startCoroutine
suspend fun doubleValue(value: Int): Int {
return value * 2
}
fun main() {
val input = 7
val events = mutableListOf("created")
val work: suspend () -> Int = {
events.add("running")
doubleValue(input)
}
work.startCoroutine(object : Continuation<Int> {
override val context = EmptyCoroutineContext
override fun resumeWith(result: Result<Int>) {
events.add("resumed=${result.getOrThrow()}")
}
})
println("events=" + events.joinToString(">"))
}
input ← 4, events ← [created], work ← () -> kotlin.Int
9fun main() {10 val input→ 4 = 4 //@input=2, 711 val events→ [created] = mutableListOf("created")1213 val work→ () -> kotlin.Int: suspend () -> Int = {14 events.add("running")15 doubleValue(input)16 }1718 work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19 override val context = EmptyCoroutineContext2021 override fun resumeWith(result: Result<Int>) {22 events.add("resumed=${result.getOrThrow()}")23 }24 })suspend fun doubleValue(value: Int): Int
5suspend fun doubleValue(value4: Int): Int {6 return value4 * 27}override fun resumeWith(result: Result<Int>)
18work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19 override val context = EmptyCoroutineContext2021 override fun resumeWith(resultSuccess(8): Result<Int>) {22 events[created, running].add("resumed=${resultSuccess(8).getOrThrow()}")23 }24})println("events=" + events.joinToString(">"))
26 println("events=" + events[created, running, resumed=8].joinToString(">"))27}outputevents=created>running>resumed=8
input ← 2, events ← [created], work ← () -> kotlin.Int
9fun main() {10 val input→ 2 = 211 val events→ [created] = mutableListOf("created")1213 val work→ () -> kotlin.Int: suspend () -> Int = {14 events.add("running")15 doubleValue(input)16 }1718 work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19 override val context = EmptyCoroutineContext2021 override fun resumeWith(result: Result<Int>) {22 events.add("resumed=${result.getOrThrow()}")23 }24 })suspend fun doubleValue(value: Int): Int
5suspend fun doubleValue(value2: Int): Int {6 return value2 * 27}override fun resumeWith(result: Result<Int>)
18work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19 override val context = EmptyCoroutineContext2021 override fun resumeWith(resultSuccess(4): Result<Int>) {22 events[created, running].add("resumed=${resultSuccess(4).getOrThrow()}")23 }24})println("events=" + events.joinToString(">"))
26 println("events=" + events[created, running, resumed=4].joinToString(">"))27}outputevents=created>running>resumed=4
input ← 7, events ← [created], work ← () -> kotlin.Int
9fun main() {10 val input→ 7 = 711 val events→ [created] = mutableListOf("created")1213 val work→ () -> kotlin.Int: suspend () -> Int = {14 events.add("running")15 doubleValue(input)16 }1718 work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19 override val context = EmptyCoroutineContext2021 override fun resumeWith(result: Result<Int>) {22 events.add("resumed=${result.getOrThrow()}")23 }24 })suspend fun doubleValue(value: Int): Int
5suspend fun doubleValue(value7: Int): Int {6 return value7 * 27}override fun resumeWith(result: Result<Int>)
18work() -> kotlin.Int.startCoroutine(object : Continuation<Int> {19 override val context = EmptyCoroutineContext2021 override fun resumeWith(resultSuccess(14): Result<Int>) {22 events[created, running].add("resumed=${resultSuccess(14).getOrThrow()}")23 }24})println("events=" + events.joinToString(">"))
26 println("events=" + events[created, running, resumed=14].joinToString(">"))27}outputevents=created>running>resumed=14