Я читаю 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
Поток возвращается в пул, пока сопрограмма ожидает, и когда ожидание завершено, сопрограмма возобновляет работу на свободном потоке в пуле.
