挂起函数中的并行工作:使用协程范围安全吗?

And*_*rew 4 android kotlin kotlin-coroutines

我正在尝试使用 kotlin 协程,我问自己,如何在同一个挂起函数中执行多项工作(例如同时调用网络和本地数据库)。研究这个问题使我得到了以下解决方案:

suspend fun doWorkInParallel() {
    coroutineScope {
        val networkCall = async { // stuff  }
        val databaseCall = async { // stuff }
        awaitAll(networkCall, databaseCall)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 使用上述方法是否正确,或者是否有另一种方法可以在同一个挂起函数中执行并行工作
  2. 当我调用挂起函数时,另一个“coroutineScope”是否会泄漏任何内容?
  3. 工作是并行完成的吗?
  4. networkCall当和 访问databaseCall同一个对象/更改同一个对象时会发生什么(例如,在networkCalla 变量内部设置为State X,在 adatabaseCall变量内部设置为Stata Y

bro*_*oot 6

这段代码非常好,它正是您应该如何使用协程执行并行计算的方式。如果不需要两个调用的返回值,可以替换async()launch()并删除awaitAll()行。coroutineScope()自动等待其所有子项完成,因此您无需手动执行此操作。

  1. 是的,这是正确的方法。
  2. 我不确定你的意思是什么。你不会在这里泄露任何东西。
  3. 是的,只要您使用由多个线程支持的协程调度程序(通常是这种情况),两个调用就会并行运行。
  4. 这是共享可变状态的典型案例。您需要以某种方式同步对共享变量的访问。这取决于您的具体情况。