gpt4 book ai didi

kotlin - 如何并行运行多个 Kotlin 协程并等待它们完成后再继续

转载 作者:行者123 更新时间:2023-12-02 13:11:36 29 4
gpt4 key购买 nike

我需要并行运行 2 个协程并等待它们完成后再继续。下面的代码有效,但它使用 GlobalScope这不是最好的方法。

有没有更好的办法?

fun getInfo(onSuccess: () -> Unit, onError: () -> Unit) {
GlobalScope.launch(Dispatchers.IO) {
try {
coroutineScope {
launch { getOne() }
launch { getTwo() }
}
onSuccess.invoke()
} catch (e: Throwable) {
onError.invoke()
}
}
}

最佳答案

我建议实现 getInfo作为一个挂起函数,它知道它应该运行的上下文。这样,从哪个上下文调用它 (*) 无关紧要。

此外,我不会使用回调来进行后续操作。
您可以根据什么来决定 getInfo()返回如何进行 (**)。

这实际上是协程的最大优点,您可以将基于回调的代码转换为读起来像顺序代码的代码。

因为你不关心 getOne() 的结果和 getTwo() , 使用 launch是正确的方法。它返回一个 Job .您可以暂停协程,直到两个函数都完成 joinAll()可以在 Collection<Job> 上调用.

suspend fun getInfo() = withContext(Dispatchers.IO) {
try {
listOf(
launch { getOne() },
launch { getTwo() }
).joinAll()
false
} catch (e: Throwable) {
true
}
}

您不需要使用 GlobalScope , 只需创建您自己的 (***)。

我用过 Default作为启动上下文 getInfo ,但任何其他上下文也可以,因为 getInfo将在它应该运行的那个上运行。
val newScope = CoroutineScope(Dispatchers.Default).launch {
val error = getInfo()
if(error) {
onSuccess()
} else {
onError()
}
}
// "newScope" can be cancelled any time

* 如果我使用了 Dispatcher.IO假装这两个函数正在做一些长时间运行的 IO 工作。

** 我在这里使用了一个简单的 bool 值,但当然你可以返回更有意义的东西。

*** 或 Hook 到生命周期感知的 Sourrouding 框架给出的某个范围

关于kotlin - 如何并行运行多个 Kotlin 协程并等待它们完成后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61262825/

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