暂停功能中的并行工作:使用coroutinescope安全吗?

vd8tlhqk  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(326)

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

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

以下是我的问题:
使用上述方法正确吗?或者在同一个暂停功能中执行并行工作是否有其他方法
当我调用suspend函数时,另一个“coroutinescope”是否泄漏了任何内容?
这项工作是并行完成的吗?
当两个 networkCalldatabaseCall 访问一个相同的对象/更改一个相同的对象(例如在 networkCall 变量设置为 State X 而在 databaseCall 变量设置为 Stata Y )

oaxa6hgo

oaxa6hgo1#

这段代码非常好,这正是使用协同程序执行并行计算的方式。如果不需要两个调用的返回值,可以替换 async() 具有 launch() 移除 awaitAll() 线路。 coroutineScope() 自动等待其所有子项完成,因此您无需手动执行此操作。
是的,这是正确的方法。
我不知道你是什么意思。你不能在这里泄露任何东西。
是的,只要您使用由多个线程支持的协同路由调度程序(通常是这种情况),两个调用都将并行运行。
这是共享可变状态的典型情况。您需要以某种方式同步对共享变量的访问。这取决于你的具体情况。

相关问题