Я читаю Kotlin Coroutine и знаю, что он основан на suspend
функции. Но что suspend
значит?
Coroutine или функция приостанавливается?
С 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
дочерняя сопрограмма завершает работу, она (внешняя async
сопрограмма) ) просыпается, берет другой поток из пула и продолжает?
Причина, по которой я упоминаю эту ветку, связана с https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
Поток возвращается в пул, пока сопрограмма ожидает, и когда ожидание завершено, сопрограмма возобновляет работу на свободном потоке в пуле.