Title here
Summary here
Kotlin’s select
expression lets you wait on multiple channel operations. Combining coroutines and channels with select is a powerful feature of Kotlin.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*
suspend fun main() = coroutineScope {
// For our example we'll select across two channels.
val c1 = Channel<String>()
val c2 = Channel<String>()
// Each channel will receive a value after some amount
// of time, to simulate e.g. blocking RPC operations
// executing in concurrent coroutines.
launch {
delay(1000)
c1.send("one")
}
launch {
delay(2000)
c2.send("two")
}
// We'll use `select` to await both of these values
// simultaneously, printing each one as it arrives.
repeat(2) {
select<Unit> {
c1.onReceive { msg1 ->
println("received $msg1")
}
c2.onReceive { msg2 ->
println("received $msg2")
}
}
}
// Close the channels
c1.close()
c2.close()
}
We receive the values “one” and then “two” as expected.
$ kotlinc -cp kotlinx-coroutines-core.jar select.kt -include-runtime -d select.jar
$ kotlin -cp kotlinx-coroutines-core.jar:select.jar SelectKt
received one
received two
Note that the total execution time is only ~2 seconds since both the 1 and 2 second delays execute concurrently.
In this Kotlin version:
kotlinx.coroutines
library for coroutines and channels.main
function is marked as suspend
and wrapped in coroutineScope
to allow the use of coroutines.launch
to start new coroutines.Channel
from kotlinx.coroutines.channels
instead of Go’s built-in channels.select
statement is replaced with Kotlin’s select
function from kotlinx.coroutines.selects
.delay
instead of Sleep
for pausing execution.This example demonstrates how Kotlin can achieve similar concurrent behavior to Go, using coroutines and channels.