suspend 函数中的并行工作:使用 coroutinescope 安全吗?

Parallel work in suspend function: Is it safe to use coroutinescope?

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

suspend fun doWorkInParallel() {
    coroutineScope {
        val networkCall = async { // stuff  }
        val databaseCall = async { // stuff }
        awaitAll(networkCall, databaseCall)
    }
}

这是我的问题:

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

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

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