Я читаю Kotlin Coroutine и знаю, что он основан на функции suspend
. Но что значит suspend
?
Сопрограмма или функция приостанавливается?
С https://kotlinlang.org/docs/reference/coroutines.html
По сути, сопрограммы являются вычислениями, которые могут быть приостановлены без блокировки потока
Я слышал, что люди часто говорят "приостановить функцию". Но я думаю, что это сопрограмма, которая приостанавливается, потому что она ждет завершения функции? "приостановить" обычно означает "прекратить работу", в этом случае сопрограмма бездействует.
🤔 Должны ли мы сказать, что сопрограмма приостановлена?
Какая сопрограмма будет приостановлена?
С https://kotlinlang.org/docs/reference/coroutines.html
Чтобы продолжить аналогию, await() может быть функцией приостановки (следовательно, также вызываемой из блока async {}), которая приостанавливает сопрограмму до тех пор, пока не выполнятся некоторые вычисления, и не вернет свой результат:
async { // Here I call it the outer async coroutine
...
// Here I call computation the inner coroutine
val result = computation.await()
...
}
🤔 В нем говорится "это приостанавливает сопрограмму до тех пор, пока не будут выполнены некоторые вычисления", но сопрограмма похожа на легкую нить. Так что, если сопрограмма приостановлена, как вычисления могут быть сделаны?
Мы видим, что await
вызывается при computation
, поэтому он может быть async
который возвращает Deferred
, что означает, что он может запустить другую сопрограмму
fun computation(): Deferred<Boolean> {
return async {
true
}
}
🤔 Цитата говорит, что приостанавливает сопрограмму. Означает ли это suspend
внешнюю async
сопрограмму или suspend
внутреннюю сопрограмму computation
?
Означает ли suspend
что в то время как внешняя async
сопрограмма ожидает (await
) завершения внутренней сопрограммы computation
, она (внешняя async
сопрограмма) бездействует (отсюда и имя приостановлено) и возвращает поток в пул потоков, а когда computation
сопрограмма computation
завершает работу он (внешняя async
сопрограмма) просыпается, берет другой поток из пула и продолжает?
Причина, по которой я упоминаю эту тему, связана с https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
Поток возвращается в пул во время ожидания сопрограммы, а когда ожидание завершено, сопрограмма возобновляется на свободном потоке в пуле