В Kotlin, в чем разница между терминами Coroutine и Продолжение? - PullRequest
0 голосов
/ 30 мая 2018

Кажется, что эти два термина взаимозаменяемы.Тем не менее, также, кажется, есть некоторая разница в том, что я изо всех сил стараюсь изо всех сил.Есть ли разница?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Это правда, эти двое довольно тесно связаны.Чтобы возобновить сопрограмму, вы на самом деле вызываете 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.

Мой вывод таков, что из-за особенностей сопрограммы Котлина (особенно из-за того, что они )) без стеков, между понятиями «сопрограмма» и «продолжение» есть размытая грань.

0 голосов
/ 30 мая 2018

Сопрограммы - это процедуры, которые по очереди выполняют свою задачу, а затем приостанавливаются, чтобы передать управление другим сопрограммам в группе, и возобновляют задачу.

Продолжение - это стек, управляющий потоком программы, который позволяетэто пропустить в разных частях вашей программы.Вы можете использовать его для управления потоком, включая сопрограмму, как глобальный switch.

...