У меня есть случай, когда я хочу построить ReceiveChannel
, используя produce
, асинхронно, но он зависает. Вот упрощенный пример:
runBlocking {
val deferredChannel = async {
produce<String> { send("foo") }
}
val channel = deferredChannel.await()
println("Got channel")
val value = channel.receive()
println("Got value $value")
}
Ни один println
не пострадал. Вероятно, что здесь происходит какая-то тупиковая ситуация с сопрограммами, но я не понимаю, где и как.
Как я могу создать ReceiveChannel
асинхронно?
Изменить: это сработает, если я изменю produce
на produce(capacity = 1)
, но почему? Разве await()
не должна добиться успеха, по крайней мере, независимо от возможностей производителя? А что, если я хочу, чтобы емкость была равна 0?
async
наasync(context = newSingleThreadContext("producer"))
не оказывает никакого влияния. - person Max   schedule 03.06.2019It works if I change produce to produce(capacity = 1)
- только потому, что вы производите всего один элемент. В производственном случае он будет продолжать производство до тех пор, пока не заполнит буфер. - person Marko Topolnik   schedule 04.06.2019async {
будет вести себя какthread {
, не имеет значения, что я помещаю в блок - он будет выполняться независимо. Но здесь этого не происходит из-за некоторого несоответствия в моем понимании. - person Max   schedule 07.06.2019thread {
, пока вы неawait()
на результате, который не имеет эквивалента вthread {
, но сравним сexecutor.submit(task).get()
, который блокирует таким же образом, потому что вы создаете тупик, когда отправленная задача ожидает, когда вы примете свой элемент, но вы не принимайте его, пока он не будет завершен. - person Marko Topolnik   schedule 07.06.2019