Gilles Barbier
11/01/2024, 12:07 PMfun main() = runBlocking {
val channel = Channel<String>()
var i = 0
launch {
repeat(1000) {
channel.send("i=$i")
i++
}
}
withTimeoutOrNull(20L) {
while (true) {
val message = channel.receive()
println(message)
}
}
println("TIMEOUT")
while (true) {
val message = channel.receive()
println(message)
}
}
Gilles Barbier
11/01/2024, 12:14 PMwithTimeoutOrNull(20L) {
while (isActive) {
withContext(NonCancellable) {
val message = channel.receive()
println(message)
}
}
}
Matthew Feinberg
11/01/2024, 12:14 PMprintln()
. See here for details.Matthew Feinberg
11/01/2024, 12:15 PMGilles Barbier
11/01/2024, 12:18 PMfun main() = runBlocking {
val channel = Channel<String>()
var i = 0
// Une coroutine pour envoyer un message dans le canal après un délai
launch {
repeat(200) {
channel.send("i=$i")
i++
}
}
withTimeoutOrNull(20L) {
while (isActive) {
withContext(NonCancellable) {
val message = channel.receive()
println(message)
}
}
}
println("TIMEOUT")
while (true) {
val message = channel.receive()
println(message)
}
}
PHondogo
11/01/2024, 12:22 PMPHondogo
11/01/2024, 12:23 PMPHondogo
11/01/2024, 12:24 PMGilles Barbier
11/01/2024, 1:02 PMfun main() = runBlocking {
val execute = { message: String -> println(message) }
val channel = Channel(onUndeliveredElement = execute)
var i = 0
// Une coroutine pour envoyer un message dans le canal après un délai
launch {
repeat(1000) {
channel.send("i=$i")
i++
}
}
withTimeoutOrNull(20L) {
while (true) {
execute(channel.receive())
}
}
println("TIMEOUT")
while (true) {
execute(channel.receive())
}
}
I wonder if there is a more elegant/obvious oneGilles Barbier
11/01/2024, 3:43 PMreceive()
function is within withTimeoutOrNull
- I can do differrently:
@OptIn(ExperimentalCoroutinesApi::class)
suspend fun <S, T> Channel<S>.onReceiveTimeout(timeout: Long, action: (S) -> T) {
val endTime = System.currentTimeMillis() + timeout
var isOpen = true
while (isOpen) {
// Use select to handle both timeout and receive without message loss
select {
onTimeout(endTime - System.currentTimeMillis()) {
isOpen = false
}
onReceive {
action(it)
}
}
}
}
fun main() = runBlocking {
val execute = { message: String -> println(message) }
val channel = Channel(onUndeliveredElement = execute)
var i = 0
// Une coroutine pour envoyer un message dans le canal après un délai
launch {
repeat(1000) {
channel.send("i=$i")
i++
}
}
channel.onReceiveTimeout(30L) {
println(it)
}
println("TIMEOUT")
while (true) {
val message = channel.receive()
println(message)
}
}
Gilles Barbier
11/01/2024, 3:44 PMPHondogo
11/01/2024, 3:50 PMGilles Barbier
11/01/2024, 3:52 PM