Kotlin - сопрограмма yield () какова его цель? - PullRequest
0 голосов
/ 03 марта 2019

Я не совсем уверен, какова цель функции yield.

Можете ли вы проверить этот пример, который у меня есть?

Я следую примеру здесь , но в любом случае.

Вот код:

val job = launch {
    val child = launch {
        try {
            delay(Long.MAX_VALUE)
        } finally {
            println("Child is cancelled")
        }
    }
    yield() //why do i need this ???????
    println("Cancelling child")
    child.cancel()
    child.join()
    yield()
    println("Parent is not cancelled")
}
job.join()

Когда я закомментирую первый результат, я получаю следующие результаты:

  • Отмена ребенка

    Родитель не отменяется

но если я оставлю доход таким, какой он есть, я получу:

  • Отмена ребенка

    Ребенок отменен

    Родитель не отменен

что значит использовать yield здесь?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

После некоторых исследований я вижу, что доходность на самом деле происходит от Java, а термин «поток» - это то, что я не понял.

по существу: yield () в основном означает, что поток не выполняет ничего важного, и, если нужно запустить другие потоки, они могут работать.(Я бы предпочел использовать join, как упомянул Алекс Ю).В основном, если мы хотим визуализировать, что происходит с yield ... любой поток, для которого вы вызываете yield, будет перенесен в конец очереди сообщений, тогда другие потоки с таким же приоритетом выполняются раньше него.так что все равно, что идти в конец очереди в клубе.

0 голосов
/ 03 марта 2019

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html

Возвращает поток (или пул потоков) текущего диспетчера сопрограмм для запуска других сопрограмм.Если диспетчер сопрограмм не имеет своего собственного пула потоков (например, Dispatchers.Unconfined), то эта функция ничего не делает, но проверяет, было ли задание сопрограммы выполнено.Эта функция приостановки отменяется.Если задание текущей сопрограммы отменяется или завершается при вызове этой функции приостановки или когда эта функция ожидает отправки, она возобновляет работу с CancellationException.

Выполняется хотя бы несколько вещей

  1. Он временно удаляет приоритеты из текущей длительной задачи ЦП, предоставляя другим задачам реальную возможность для выполнения.
  2. Проверяет, отменено ли текущее задание, так как в противном случае в узко замкнутом цикле ЦП заданиене может проверять до конца.
  3. Позволяет продвижение дочерних заданий, где есть конфликт, потому что больше заданий, чем потоков.Это может быть важно, если текущая работа должна адаптироваться на основе прогресса других работ.
...