如何启动并行协程并返回结果

时间:2020-07-15 20:30:25

标签: kotlin coroutine kotlin-coroutines

我正在尝试编写一个函数,该函数异步运行2个操作,并使用Kotlin协程返回结果。例如,我希望我的getData方法大致同时运行我的两个longRunningOperationX方法,以便更快地获得合并结果:

fun getData(): String {
  val stringOne = longRunningStringOperationOne()
  val stringTwo = longRunningStringOperationTwo()
  return stringOne + stringTwo
}

在Kotlin中,我可以使用launchasync方法运行这些操作。

fun getData(): String {
  GlobalScope.launch { 
    val stringOne = async { longRunningStringOperationOne() }
    val stringTwo = async { longRunningStringOperationTwo() }
    println("result: $stringOne + $stringTwo")
    // return "result: $stringOne + $stringTwo" <- not allowed
  }
  return "?"
}

但是,您可能知道,在GlobalScope之外无法访问Coroutine范围内的操作结果,因此,我的方法只需要返回当时的内容即可,运行操作完成。

因此,在存在此问题的情况下-返回结果的非暂停功能(不是kotlin suspend fun)-我如何才能异步(并行)运行两个长时间运行的操作,但要等到它们的结果之后才能运行返回使用Kotlin协程?

1 个答案:

答案 0 :(得分:2)

您将要使用Structured Concurrency代替Global Scope,并使用await()返回的async作业。一种方法是这样的:

fun getData(): String {
  return runBlocking { 
    val stringOne = async { longRunningStringOperationOne() }
    val stringTwo = async { longRunningStringOperationTwo() }
    "result: ${stringOne.await()} + ${stringTwo.await()}")  // will be the return value of the runBlocking lambda
  }
}