Это правда, эти двое довольно тесно связаны.Чтобы возобновить сопрограмму, вы на самом деле вызываете continuation.resume()
.
У каждой сопрограммы есть связанный объект продолжения.На самом деле, вам не нужно ничего, кроме этого объекта, он содержит полное состояние сопрограммы.
В определенной степени, Kotlin использует «сопрограмму», чтобы также включить контекст сопрограммы, который дает сопрограммузнание, как именно приостановить себя, где сохранить продолжение, пока оно приостановлено, и как возобновить (отправить) его позже.Но вы также можете использовать контекст сопрограммы Unconfined
, который почти так же хорош, как отсутствие контекста, и полностью контролировать возобновление, сохраняя только объект продолжения:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
var continuation: Continuation<Unit>? = null
fun main(args: Array<String>) {
GlobalScope.launch(Dispatchers.Unconfined) {
println("Suspending")
suspendCoroutine<Unit> { cont ->
continuation = cont
}
println("Resumed!")
}
println("After launch")
continuation!!.resume(Unit)
println("After continuation.resume(Unit)")
}
Здесь выМожно видеть, что мы воспроизвели весь сценарий приостановки-возобновления, не оставляя ничего, кроме объекта Continuation
.
Мой вывод таков, что из-за особенностей сопрограммы Котлина (особенно из-за того, что они )) без стеков, между понятиями «сопрограмма» и «продолжение» есть размытая грань.