kotlin - 如何并行运行多个 Kotlin 协程并等待它们完成后再继续
问题描述
我需要并行运行 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()
}
}
}
解决方案
你可以使用任何你喜欢的范围。这不影响你的问题。不鼓励使用 GlobalScope,因为它不封装您的任务。
实际使用哪个范围来启动您的协程将完全取决于您正在做什么的上下文以及您正在使用的封装策略。
要一次启动多个协程并等待所有协程,请使用async
and await()
。awaitAll()
如果您只需要在继续之前完成所有这些,您可以使用它们的列表。
您使用 IO 调度程序来运行您的回调似乎很奇怪,但我会留下它,因为我对您的代码的上下文视而不见。
fun getInfo(onSuccess: () -> Unit, onError: () -> Unit) {
GlobalScope.launch(Dispatchers.IO) {
try {
coroutineScope {
listOf(
async { getOne() }
async { getTwo() }
}.awaitAll()
}
onSuccess.invoke()
} catch (e: Throwable) {
onError.invoke()
}
}
}
推荐阅读
- python - 为什么我的 A*Atranspose 和 Atranspose*A 的特征值不匹配?
- hadoop - 我怎么知道在 /mnt/yarn/usercache 和 /var/log/hadoop-yarn/containers 目录中删除什么是安全的?
- linq - EF Core 对 SQL 请求的正确解释
- python - 使用 Python 从具有某种结构的 txt 中提取数据
- python-3.x - 为什么颜色条没有出现在我的 cloropleth 地图中?
- sql-server - 将字符串连接到 @declare
- python - 如何从 aiohttp 响应中获取 IP 地址
- javascript - 在 swiftui 中评估 JavaScript
- javascript - 尝试增加分数时获得 NaN
- javascript - html href 和服务器监听器上的 fetch 调用之间的区别