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)
}
}
这是我的问题:
- 使用上述方法是否正确,或者是否有另一种方法可以在同一个挂起函数中执行并行工作
- 当我调用挂起函数时,另一个“coroutineScope”是否泄漏了任何东西?
- 工作是并行完成的吗?
- 当
networkCall
和 databaseCall
访问同一个对象/更改同一个对象时会发生什么(例如,在 networkCall
中,变量设置为State X
并且在 databaseCall
中变量设置为 Stata Y
)
这段代码非常好,这正是您使用协程执行并行计算的方式。如果您不需要两个调用的 return 值,您可以将 async()
替换为 launch()
并删除 awaitAll()
行。 coroutineScope()
自动等待其所有子项完成,因此您无需手动执行此操作。
- 是的,这是正确的方法。
- 我不太清楚你是什么意思。你不要在这里泄露任何东西。
- 是的,只要您使用由多个线程支持的协程调度程序(通常是这种情况),两个调用都会 运行 并行。
- 这是共享可变状态的典型案例。您需要以某种方式同步对共享变量的访问。这取决于您的具体情况。
我正在尝试使用 kotlin 协同程序,我问自己,如何在同一个挂起函数中执行多项工作(例如同时调用网络和本地数据库)。研究这个问题使我找到了以下解决方案:
suspend fun doWorkInParallel() {
coroutineScope {
val networkCall = async { // stuff }
val databaseCall = async { // stuff }
awaitAll(networkCall, databaseCall)
}
}
这是我的问题:
- 使用上述方法是否正确,或者是否有另一种方法可以在同一个挂起函数中执行并行工作
- 当我调用挂起函数时,另一个“coroutineScope”是否泄漏了任何东西?
- 工作是并行完成的吗?
- 当
networkCall
和databaseCall
访问同一个对象/更改同一个对象时会发生什么(例如,在networkCall
中,变量设置为State X
并且在databaseCall
中变量设置为Stata Y
)
这段代码非常好,这正是您使用协程执行并行计算的方式。如果您不需要两个调用的 return 值,您可以将 async()
替换为 launch()
并删除 awaitAll()
行。 coroutineScope()
自动等待其所有子项完成,因此您无需手动执行此操作。
- 是的,这是正确的方法。
- 我不太清楚你是什么意思。你不要在这里泄露任何东西。
- 是的,只要您使用由多个线程支持的协程调度程序(通常是这种情况),两个调用都会 运行 并行。
- 这是共享可变状态的典型案例。您需要以某种方式同步对共享变量的访问。这取决于您的具体情况。