Я читал основы Coroutine, пытаясь понять и изучить это.
Там есть часть с этим кодом:
fun main() = runBlocking { // this: CoroutineScope
    launch { 
        delay(200L)
        println("Task from runBlocking")
    }
    coroutineScope { // Creates a new coroutine scope
        launch {
            delay(900L) 
            println("Task from nested launch")
        }
        delay(100L)
        println("Task from coroutine scope") // This line will be printed before nested launch
    }
    println("Coroutine scope is over") // This line is not printed until nested launch completes
}
Вывод выглядит так:
Task from coroutine scope
Task from runBlocking
Task from nested launch
Coroutine scope is over
Мой вопрос, почему эта строка:
 println("Coroutine scope is over") // This line is not printed until nested launch completes
называется всегда последний?
Не должен ли он быть вызван, так как:
coroutineScope { // Creates a new coroutine scope
    ....
}
приостановлено?
Там также есть примечание:
Основное различие между runBlocking и coroutineScope заключается в том, что последний не блокирует текущий поток, ожидая завершения всех дочерних элементов.
Я не понимаю, чем здесь отличаются coroutineScope и runBlocking? coroutineScope выглядит как его блокировка, так как он достигает только последней строки, когда это сделано.
Кто-нибудь может просветить меня здесь?
Заранее спасибо.
