Scope builder в Kotlin
В дополнение к CoroutineScope, которая предоставляется различными билдерами, вы можете, используя coroutineScope, объявить собственную область видимости. Этот билдер создает область видимости и не завершается до тех пор, пока не завершатся все дочерние сопрограммы, которые запущены.
При этом coroutineScope и runBlocking могут выглядеть одинаково, так как они: 1) ожидают завершения всех операций внутри своего блока; 2) ожидают завершения всех дочерних сопрограмм, которые запущены.
Главное отличие — метод runBlocking блокирует текущий поток, тогда как как coroutineScope лишь просто приостанавливает работу, освобождая основной поток для иных целей. Благодаря этой разнице, runBlocking считается обычной функцией, тогда как coroutineScope— это функция приостановки.
Пример ниже демонстрирует вышесказанное:
Также следует учесть, что непосредственно после сообщения "Task from coroutine scope" (когда ожидается выполнение вложенного launch) происходит выполнение и выдача "Task from runBlocking", и это при том, что выполнение coroutineScope еще не завершилось.
По материалам https://kotlinlang.ru/