Различия между двумя сопрограммами запуска в kotlin - PullRequest
2 голосов
/ 03 апреля 2020

В чем разница между CoroutineScope(dispatchers).launch{} и coroutineScope{ launch{}}?

Допустим, у меня есть код ниже:

(вы можете go до Kotlin площадка для запуска этого фрагмента https://pl.kotl.in/U4eDY4uJt)

suspend fun perform(invokeAfterDelay: suspend () -> Unit) {
    // not printing
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        invokeAfterDelay()
    }


    // will print
    coroutineScope {
        launch {
            delay(1000)
            invokeAfterDelay()
        }
    }
}

fun printSomething() {
    println("Counter")
}


fun main() {
    runBlocking {
        perform {
            printSomething()
        }
    }

}

И, как отмечается в комментарии, при использовании CoroutineScope().launch он не будет вызывать печать, однако при использовании другого способа код работает так, как задумано.

В чем разница?

Спасибо.

Дополнительный вопрос

Новые результаты.

если я оставлю функцию perform как это (без комментирования одной из сопрограмм)

suspend fun perform(invokeAfterDelay: suspend () -> Unit) {

        CoroutineScope(Dispatchers.Default).launch {
            delay(1000)
            invokeAfterDelay()
        }

        coroutineScope {
            launch {
                delay(1000)
                invokeAfterDelay()
            }
        }

    }

, тогда обе эти сопрограммы будут выполнены ?Почему?

1 Ответ

1 голос
/ 03 апреля 2020

CoroutineScope().launch {} и coroutineScope { launch{} } почти ничего общего не имеют. Первый просто устанавливает ad-ho c область действия для launch для запуска с немедленным завершением, а последний является приостанавливаемой функцией, которая гарантирует, что все сопрограммы, запущенные в нем, завершаются до его возврата.

Фрагмент вашего «Дополнительного вопроса» идентичен исходному, за исключением удаленных комментариев.

Независимо от того, печатает ли первая сопрограмма что-либо, поведение не определено c: а perform проводя время в пределах coroutineScope, ожидая завершения внутренней launch ed сопрограммы, первая может завершиться или не завершиться сама. У них одинаковая задержка.

...