runBlocking Coroutine не блокирует GlobalScope.launch (?) - PullRequest
3 голосов
/ 06 апреля 2019

Подпрограмма Kotlin runBlocking Coroutine должна блокировать текущий поток, пока сопрограмма внутри блока не завершит выполнение, но, похоже, этого не происходит, когда сопрограмма внутри блока имеет значение GlobalScope.launch

Я пытаюсь понять, как работают сопрограммы Котлина, и читаю документацию здесь - https://kotlinlang.org/docs/reference/coroutines/basics.html

В примере -

fun main() = runBlocking<Unit> { // start main coroutine
    GlobalScope.launch { // launch new coroutine in background and continue
        delay(1000L)
        println("World!")
    }
    println("Hello,") // main coroutine continues here immediately
    delay(2000L)      // delaying for 2 seconds to keep JVM alive
}

Упоминается, что «основной поток, который вызывает runBlocking, блокируется до завершения сопрограммы внутри runBlocking». Если это так, то зачем нам двухсекундная задержка , чтобы заблокировать основной поток в конце runBlocking? Почему runBlocking не блокирует основной поток, пока не завершится GlobalScope.launch?

Однако следующий внутренний runBlocking блокирует основной поток до завершения функции задержки. Какая здесь разница? Почему не запускается блокировка в главном потоке вышеупомянутого блока, пока GlobalScope.launch не завершится аналогичным образом -

fun main(){ // start main coroutine
    GlobalScope.launch { // launch new coroutine in background and continue
        delay(1000L)
        println("World!")
    }
    println("Hello,") // main coroutine continues here immediately
    runBlocking{
     delay(2000L)      // delaying for 2 seconds to keep JVM alive
    }
}

Я ожидаю, что когда основная функция обернута в подпрограмму runBlocking, главный поток должен быть заблокирован до тех пор, пока GlobalScope.launch не завершит свое выполнение.

1 Ответ

2 голосов
/ 08 апреля 2019

Сопрограмма в области будет блокироваться, пока все ее дочерние элементы (job s) в той же области не будут завершены. Однако явный запуск сопрограмм в другой области не сделает их настоящими детьми, и поэтому они не ожидаются.

Эта статья также предоставляет немного информации об этом конкретном случае: https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc

...