Блокируются ли функции приостановки Kotlin?

#kotlin #kotlin-coroutines #coroutine #suspend

#kotlin #kotlin-сопрограммы #сопрограмма #приостановить

Вопрос:

Код:

 suspend fun main() {
    println("main start")
    f1()
    println("main end")
}

suspend fun f1() {
    println("f1 start")
    delay(2_000)
    println("f1 end")
}
  

Фактический результат:

 main start
f1 start
f1 end
main end
  

Мой ожидаемый результат

 main start
f1 start
main end
f1 end
  

Означает ли это suspend , что функции блокируются в отличие от JS?

Комментарии:

1. Что создало у вас впечатление, что вы получите второй результат? Функции приостановки Kotlin являются частью поддержки сопрограмм Kotlin — уникальным преимуществом является то, что асинхронный код выглядит как синхронный код.

2. Я не понимаю, как это не блокируется. Разве это не блокировка? Выполнение ожидает 2 f1() секунды перед печатью main end . Мое понимание отсутствия блокировки заключается в том, что выполнение ничего не ждет. Как только выполнение увидит delay , что оно переходит к следующей доступной инструкции, которая println("main end")

3. Ожидание выполнения. Поток этого не делает. В этом весь смысл структурированного параллелизма. Это лучше всего моделировать и понимать как обратные вызовы.

Ответ №1:

Это поведение по умолчанию подробнее о приостановке функций читайте здесь, если вы хотите работать f1 асинхронно, вы должны использовать async как:

 suspend fun main() {
    withContext(Dispatchers.Main) {
        println("main start")//Run in main
        val getF1 = async(Dispatchers.IO) { f1() } // Run f1 in IO
        println("main end") // Run in main
        println(getF1.await())//Run in main
    }
}

suspend fun f1() : String {
    println("f1 start")
    delay(2_000)
    println("f1 end")
    return "f1 result"
}
  

Комментарии:

1. Спасибо. Это проясняет ситуацию. Я неправильно понял, потому что предположил, что каждая функция приостановки создает свою собственную сопрограмму. Но на самом деле в моем коде создается только одна сопрограмма.