Котлин: прием элементов в разных сопрограммах не работает должным образом - PullRequest
0 голосов
/ 08 февраля 2019

Я ниже кода сопрограммы kotlin.

    import kotlinx.coroutines.*
    import kotlinx.coroutines.channels.*

    fun main() = runBlocking <Unit> {
        val channel = Channel<Int>(4)
        val sender = launch (coroutineContext) {
            repeat(10) {
                println("sending $it")
                channel.send(it)
                delay(100)
            }
        }

        delay(1000)

        //launch {  for (y in channel) println("receiving $y") }

        for (y in channel) println("receiving $y")
    }

Работает нормально.Если я добавлю логику для получения элементов из канала в другую сопрограмму (то есть, поместим for внутри launch, как в закомментированном коде), то она получит удар при выводе ниже (т.е. я ожидаю отправку и получение до 10, ноэто застревает на receiving 3).

    sending 0
    sending 1
    sending 2
    sending 3
    sending 4
    receiving 0
    receiving 1
    receiving 2
    receiving 3

Как получить элементы в другой сопрограмме без каких-либо глюков?

Я использую версию compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1")

1 Ответ

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

Причина в том, что ваш канал не закрыт, поэтому цикл for-each может никогда не закончиться.Если вы закроете свой канал после блока repeat, код будет завершен корректно:

import kotlinx.coroutines. * Import kotlinx.coroutines.channels. *

fun main() = runBlocking <Unit> {
    val channel = Channel<Int>(4)
    val sender = launch (coroutineContext) {
        repeat(10) {
            println("sending $it")
            channel.send(it)
            delay(100)
        }
        channel.close()
    }

    delay(1000)

    launch {  for (y in channel) println("receiving $y") }

}
...