我有一个关于 Kotlin 流缓冲区容量的问题。下面的代码:
import kotlinx.coroutines.flow.*
suspend fun main() = coroutineScope {
flow {
for (i in 1..3) {
println("Emiting $i")
emit(i)
}
}.buffer(0)
.collect {
value ->
delay(100)
println("Consuming $value")
}
}
Run Code Online (Sandbox Code Playgroud)
生成以下输出:
Emiting 1
Emiting 2
Consuming 1
Emiting 3
Consuming 2
Consuming 3
Run Code Online (Sandbox Code Playgroud)
如果我删除缓冲区,结果是:
Emiting 1
Consuming 1
Emiting 2
Consuming 2
Emiting 3
Consuming 3
Run Code Online (Sandbox Code Playgroud)
我是否应该假设容量为 0 时实际上是 1?
不,容量实际上是 0。看起来你正在缓冲一个元素,因为收集首先消耗一个元素,然后延迟 100ms。这允许流程同时发出另一个元素。
该buffer函数实际上创建了第二个协程,允许flow和collect函数同时执行。如果没有调用,每个元素都必须在before 之前buffer完成才能继续下一个元素,因为这两个函数都是由同一个协程执行的。collectflow
让我们逐步检查您的代码以了解它是如何发生的:
Emitting 1、发出1并暂停。1,然后开始延迟 100ms。1,延迟 1ms,打印Emitting 2,发出2,然后挂起。Consuming 1,然后消费2并延迟100ms。2,延迟 1ms,打印Emitting 3,发出3,然后挂起。Consuming 2,然后消费3并延迟100ms。Consuming 3,然后完成收集。您可以buffer在这里阅读更多信息:https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/buffer.html
| 归档时间: |
|
| 查看次数: |
5231 次 |
| 最近记录: |