关于kotlin coroutine & SharedFlow使用的问题
Questions about kotlin coroutine & SharedFlow usage
我是新手,想请教coroutine和sharedFlow的正确用法
例如下面的代码,在函数中我想并行调用两个动作。我预计会有 3 种可能的结果:
-action1先得到return结果,然后我们将它的结果用于return函数foo。
-action2先return结果,然后我们用它的结果return。
-整个动作在3s后超时并抛出超时错误。
suspend fun foo() {
val a = MutableSharedFlow<Int>()
val sf = a.asSharedFlow()
return withTimeout(3000) {
launch {
action1().let { a.emit(it) }
}
launch {
action2().let { a.emit(it) }
}
sf.first {
return@withTimeout it
}
}
}
我的问题是:
foo被return后,action1和action2这两个启动的协程会不会被取消?或者他们会在后台继续运行?
假设操作 1 已 returned,但操作 2 不会 return 永远返回(可能是网络问题)。尽管代码可能已经退出 foo,但 action2 会导致 SharedFlow 永远泄漏吗?
我是否需要明确地做任何事情来关闭函数 foo 内声明的 MutableSharedFlow 或 SharedFlow?或者它们会在函数 foo returned?
之后正常关闭和垃圾回收吗?
由于 withTimeout
在超时后取消其作业,因此在 returns 时将取消任何剩余的子协程。从文档中我不清楚它是否在超时前 returns 时立即取消子项(我们可以检查源代码以找出答案)。但是一旦它们被取消,将不再有对共享流的保留引用,因此它将被释放。
您的 sf
变量没有完成任何事情。
在函数内部使用流很复杂。您可以将其全部替换为:
suspend fun foo(): Int? = withTimeoutOrNull(3000) {
select<Int> {
async { action1() }.onAwait { it }
async { action2() }.onAwait { it }
}
}
我是新手,想请教coroutine和sharedFlow的正确用法
例如下面的代码,在函数中我想并行调用两个动作。我预计会有 3 种可能的结果:
-action1先得到return结果,然后我们将它的结果用于return函数foo。 -action2先return结果,然后我们用它的结果return。 -整个动作在3s后超时并抛出超时错误。
suspend fun foo() {
val a = MutableSharedFlow<Int>()
val sf = a.asSharedFlow()
return withTimeout(3000) {
launch {
action1().let { a.emit(it) }
}
launch {
action2().let { a.emit(it) }
}
sf.first {
return@withTimeout it
}
}
}
我的问题是:
foo被return后,action1和action2这两个启动的协程会不会被取消?或者他们会在后台继续运行?
假设操作 1 已 returned,但操作 2 不会 return 永远返回(可能是网络问题)。尽管代码可能已经退出 foo,但 action2 会导致 SharedFlow 永远泄漏吗?
我是否需要明确地做任何事情来关闭函数 foo 内声明的 MutableSharedFlow 或 SharedFlow?或者它们会在函数 foo returned?
之后正常关闭和垃圾回收吗?
由于 withTimeout
在超时后取消其作业,因此在 returns 时将取消任何剩余的子协程。从文档中我不清楚它是否在超时前 returns 时立即取消子项(我们可以检查源代码以找出答案)。但是一旦它们被取消,将不再有对共享流的保留引用,因此它将被释放。
您的 sf
变量没有完成任何事情。
在函数内部使用流很复杂。您可以将其全部替换为:
suspend fun foo(): Int? = withTimeoutOrNull(3000) {
select<Int> {
async { action1() }.onAwait { it }
async { action2() }.onAwait { it }
}
}