Coroutine Context: Accessing and Creating Context
Learn about coroutine context and how to access context in a suspending function or create a unique context.
We'll cover the following...
So CoroutineContext
is just a way to hold and pass data. By default, the parent passes its context to the child, one of the parent-child relationship effects. We say that the child inherits context from its parent.
package kotlinx.coroutines.app import kotlinx.coroutines.* fun CoroutineScope.log(msg: String) { val name = coroutineContext[CoroutineName]?.name println("[$name] $msg") } fun main() = runBlocking(CoroutineName("main")) { log("Started") // [main] Started val v1 = async { delay(500) log("Running async") // [main] Running async 42 } launch { delay(1000) log("Running launch") // [main] Running launch } log("The answer is ${v1.await()}") // [main] The answer is 42 }
Parent-child relationship
Each child might have a specific context defined in the argument. This context overrides the one from the parent.
package kotlinx.coroutines.app import kotlinx.coroutines.* fun CoroutineScope.log(msg: String) { val name = coroutineContext[CoroutineName]?.name println("[$name] $msg") } fun main() = runBlocking(CoroutineName("main")) { log("Started") // [main] Started val v1 = async(CoroutineName("c1")) { delay(500) log("Running async") // [c1] Running async 42 } launch(CoroutineName("c2")) { delay(1000) log("Running launch") // [c2] Running launch } log("The answer is ${v1.await()}") // [main] The answer is 42 }
Overriding
Here is a simplified formula to calculate a coroutine context.
defaultContext + parentContext + childContext
Since new elements always replace old ones with the same key, the child context always overrides ...