Kotlin流缓冲能力

Ped*_*pio 7 kotlin

我有一个关于 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?

mar*_*ran 7

不,容量实际上是 0。看起来你正在缓冲一个元素,因为收集首先消耗一个元素,然后延迟 100ms。这允许流程同时发出另一个元素。

buffer函数实际上创建了第二个协程,允许flowcollect函数同时执行。如果没有调用,每个元素都必须在before 之前buffer完成才能继续下一个元素,因为这两个函数都是由同一个协程执行的。collectflow

让我们逐步检查您的代码以了解它是如何发生的:

  1. 流程延迟 1ms,打印Emitting 1、发出1并暂停。
  2. Collect 立即消耗1,然后开始延迟 100ms。
  3. 由于被消耗,流程继续1,延迟 1ms,打印Emitting 2,发出2,然后挂起。
  4. Collect完成延迟100ms,打印Consuming 1,然后消费2并延迟100ms。
  5. 由于被消耗,流程继续2,延迟 1ms,打印Emitting 3,发出3,然后挂起。
  6. Collect完成延迟100ms,打印Consuming 2,然后消费3并延迟100ms。
  7. 收集完成延迟100ms,打印Consuming 3,然后完成收集。
  8. 该流程继续,并结束,因为没有更多的元素可以发出。

您可以buffer在这里阅读更多信息:https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/buffer.html