【问题标题】:Execute coroutines in pararell and wait for all to finish并行执行协程并等待全部完成
【发布时间】:2021-06-10 14:42:48
【问题描述】:

我有一个向 API 发出不同请求的视图模型,我目前正在像这样调用我的 API

        val call1 = repo.getCall1()
        val call2 = repo.getCall2()
        val call3 = repo.getCall3()
        val call4 = repo.getCall4()
        val call5 = repo.getCall5()
        val call6 = repo.getCall6()

这种方法的问题是我需要等待每个人完成启动另一个,在我对 repo 进行调用(都是挂起函数)之后,我通知 livedatas,但这需要一点时间(4 - 5 秒),我想同时进行所有呼叫,并在通知我的 livedata 之前一次性捕获它们

我正在寻找类似的东西

myCoroutineScope.launch {

            call1 = repo.getCall1()
            call2 = repo.getCall2()
            call3 = repo.getCall3()
            call4 = repo.getCall4()
            call5 = repo.getCall5()
            call6 = repo.getCall6()
    }.awaitForAllToFinish()

我想使用 async - await 而不是作业

【问题讨论】:

  • 在 Kotlin 中,async-await 工作,与您 launch 的工作相同。唯一的区别是您不期望来自launched 作业的结果值。你甚至使用返回值吗?如果没有,那么你不需要async,应该使用coroutineScope { launch(task1); launch(task2) ... }

标签: android kotlin kotlin-coroutines


【解决方案1】:

如果所有调用的结果都是同一类型,可以使用listOfawaitAll来做:

val results = listOf(
        async { repo.getCall1() }
        async { repo.getCall2() }
        async { repo.getCall3() }
        async { repo.getCall4() }
        async { repo.getCall5() }
        async { repo.getCall6() }
    ).awaitAll()

如果不是,我想您会希望为每个变量保留变量。请注意,与您的原始代码不同,这将并行运行它们。

val call1 = async { repo.getCall1() }
val call2 = //...

val result1 = call1.await()
val result2 = call2.await()
// ...

// use the results

或者像你在第一条评论中建议的那样做,也许像这样(没有检查)。但同样,如果结果类型不完全相同,则不实用。

val call1 = async { repo.getCall1() }
val call2 = //...

val jobs = listOf(call1, call2, call3, ...)
val resultsByJob = jobs.zip(jobs.awaitAll())

val result1 = resultsByJob[call1]!!

【讨论】:

  • 酷!有没有办法识别每个异步操作而不是结果索引?像,不是 results[0] ,我的意思是像 results[call1]
  • 有没有办法将每个异步工作映射到类型?
  • 如果它们有不同的类型,我认为最干净的做法是保留单独的变量并在声明所有变量后调用它们。见编辑。
  • 您还应该确保将所有asyncawaits 包装在coroutineScope 中。
  • @MarkoTopolnik 如果其中一个失败,其他async 兄弟姐妹不必运行完成吗?我不确定这是否总是理想的行为。还是有其他好处?
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 2020-04-08
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2020-05-27
相关资源
最近更新 更多