...

/

Coroutine Context: Accessing and Creating Context

Coroutine Context: Accessing and Creating Context

Learn about coroutine context and how to access context in a suspending function or create a unique context.

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 ...