[英]Parallel processing values emitted by flow in Kotlin
Kotlin代碼
runBlocking {
flow {
for (i in 0..4) {
println("Emit $i")
emit(i)
}} .onEach { if (it%2 == 0) delay(200) // Block 1
println("A: got $it")
}
.onEach { println("B: got $it") } // Block 2
.collect()
}
在控制台打印:
Emit 0
A: got 0
B: got 0
Emit 1
A: got 1
B: got 1
Emit 2
...
在一半的情況下,如何同時運行 block1 和 block2 以在 block 1 之前從 block 2 獲取消息?
您可以嘗試在這些塊中啟動單獨的協程:
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
flow {
for (i in 0..4) {
println("Emit $i")
emit(i)
}
}.onEach { // Block 1
scope.launch {
if (it % 2 == 0) delay(200)
println("A: got $it")
}
}.onEach { // Block 2
scope.launch {
println("B: got $it")
}
}.launchIn(scope)
在這種情況下, Block 2
將在Block 1
之前打印。 SupervisorJob
需要在這里防止在其中一個失敗時取消已啟動的協程。
此解決方案不保證順序,例如下一個順序可能有日志:
Emit 0
Emit 1
Emit 2
Emit 3
Emit 4
B: got 0
A: got 1
B: got 1
B: got 2
A: got 3
B: got 3
B: got 4
A: got 0
A: got 2
A: got 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.