从 withTimeout 获取值
Get value from withTimeout
我是 运行 一个正在读取 receiverChannel
的协程。我已经将这个协程包裹在超时内,我想在超时取消之前获取它设法读取的消息数。这是我拥有的:
runBlocking {
val receivedMessages = withTimeoutOrNull(someTimeout) {
var found = 0
while (isActive && found < expectedAmount){
val message = incomming.receive()
// some filtering
found++
}
found
} ?: 0 // <- to not have null...
// Currently prints 0, but I want the messages it managed to read
println("I've received $receivedMessages messages")
}
我知道我可以使用 atomicInteger,但我想在此处远离 java 细节
协程中的局部变量不需要是原子的,因为 happens-before guarantee 即使可能有一些线程交换正在进行。您的代码没有任何并行性,因此您可以使用以下代码:
runBlocking {
var receivedMessages = 0
withTimeoutOrNull(someTimeout) {
while (isActive && receivedMessages < expectedAmount){
val message = incomming.receive()
// some filtering
receivedMessages++
}
}
println("I've received $receivedMessages messages")
}
如果您确实有多个并行的子协程 运行,您可以使用 Mutex。 More info here
我是 运行 一个正在读取 receiverChannel
的协程。我已经将这个协程包裹在超时内,我想在超时取消之前获取它设法读取的消息数。这是我拥有的:
runBlocking {
val receivedMessages = withTimeoutOrNull(someTimeout) {
var found = 0
while (isActive && found < expectedAmount){
val message = incomming.receive()
// some filtering
found++
}
found
} ?: 0 // <- to not have null...
// Currently prints 0, but I want the messages it managed to read
println("I've received $receivedMessages messages")
}
我知道我可以使用 atomicInteger,但我想在此处远离 java 细节
协程中的局部变量不需要是原子的,因为 happens-before guarantee 即使可能有一些线程交换正在进行。您的代码没有任何并行性,因此您可以使用以下代码:
runBlocking {
var receivedMessages = 0
withTimeoutOrNull(someTimeout) {
while (isActive && receivedMessages < expectedAmount){
val message = incomming.receive()
// some filtering
receivedMessages++
}
}
println("I've received $receivedMessages messages")
}
如果您确实有多个并行的子协程 运行,您可以使用 Mutex。 More info here