Avatar ·

Qual é a diferença entre runBlocking e coroutineScope em Kotlin Coroutines?

Olá, colegas! Comecei a estudar coroutines em Kotlin e me deparei com duas funções que me parecem muito semelhantes: runBlocking e coroutineScope. Li a documentação, mas para mim o comportamento delas ainda não está claro.

Aqui está um exemplo que escrevi:

fun main() = runBlocking {
    launch {
        delay(1000L)
        println("World!")
    }
    println("Hello,")
}

E outro:

fun main() = runBlocking {
    coroutineScope {
        launch {
            delay(1000L)
            println("World!")
        }
        println("Hello,")
    }
}

Ambos os exemplos imprimem primeiro "Hello," e, após um segundo, "World!". Mas suspeito que haja uma diferença, e que ela é importante. Em que consiste?

Especificamente, tenho interesse em:

  • Por que runBlocking bloqueia a thread atual, enquanto coroutineScope não?
  • Como essas funções se comportam em rea