Kotlin:第一次发射时的 MutableSharedFlow BufferOverflow 行为

Kotlin: MutableSharedFlow BufferOverflow behaviour on first emissions

我有以下代码片段:

val flow = MutableSharedFlow<Int>()

launch {
    repeat(10) {
        delay(100)
        println("emitting$it")
        flow.emit(it)
    }
}
    
launch {
    flow.collect {
        delay(1000)
        println("a$it")
    }
}

launch {
    flow.collect {
        println("b$it")
    }
}

我希望输出如下:

发射0 b0 a0 发射1 b1 a1 ...

因为 BufferOverflow.SUSPEND 导致发射器等待事件被消耗。

实际输出遵循此模式,但前两个元素除外,因此实际输出为: emitting0 b0 emitting1 b1 a0(现在它开始遵循我预期的行为)emitting2 b2 a1 emitting3 b3 a2 ...

是什么导致了第二项排放?它不应该等待第一个项目被消耗吗?

它确实在等待。让您感到困惑的是打印 a# 之前的 delay(1000)。当它打印 a# 时,已经过了 1 秒,因为它开始使用它。交换一下,你就会看清楚了。

flow.collect {
    println("a$it")
    delay(1000)
}

你也可以在一个项目被发射后打印一些其他的东西来让它更清楚:

repeat(10) {
    delay(100)
    println("emitting$it")
    flow.emit(it)
    println("emited$it")
}

这是它的输出:

emitting0
a0
b0
emited0
emitting1
b1
a1
emited1
emitting2
b2
a2
emited2
...