#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. Спасибо. Это проясняет ситуацию. Я неправильно понял, потому что предположил, что каждая функция приостановки создает свою собственную сопрограмму. Но на самом деле в моем коде создается только одна сопрограмма.