gpt4 book ai didi

kotlin - Flow的collect会阻塞执行吗?

转载 作者:行者123 更新时间:2023-12-02 16:04:57 25 4
gpt4 key购买 nike

我运行代码A,得到了结果A,在我看来,应该是结果B。

似乎 flow.collect { value -> println(value) } block 要执行。

Flow block 的collect会执行吗?

代码A

fun simple(): Flow<Int> = flow { 
println("Flow started")
for (i in 1..3) {
delay(300)
emit(i)
}
}

fun main() = runBlocking<Unit> {
println("Calling simple function...")
val flow = simple()
println("Calling collect...")
flow.collect { value -> println(value) } //Block?
println("Calling collect again...")
}

结果A

Calling simple function...
Calling collect...
Flow started
1
2
3
Calling collect again...

结果 B

Calling simple function...
Calling collect...
Flow started
Calling collect again...
1
2
3

顺便说一句,我运行代码 1 并按预期获得结果 1。

代码 1

fun simple(): Flow<Int> = flow {
for (i in 1..3) {
delay(100)
emit(i)
}
}

fun main() = runBlocking<Unit> {
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
simple().collect { value -> println(value) }
}

结果 1

I'm not blocked 1
1
I'm not blocked 2
2
I'm not blocked 3
3

最佳答案

挂起函数不会阻塞,但它们是同步的,这意味着协程中代码的执行会等待挂起函数返回,然后再继续。挂起函数调用和阻塞函数调用的区别在于,在协程等待挂起函数返回时释放线程以用于其他任务。

collect 是一个挂起函数,它在内部重复和同步地调用它的 lambda(挂起,而不是阻塞)并且在流程完成之前不会返回。

launch 是启动协程的异步函数。它会立即返回,而无需等待其协程完成,这就是代码 1 表现如您预期的原因。

关于kotlin - Flow的collect会阻塞执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69684632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com