当前位置: 首页 > 知识库问答 >
问题:

在pararell中执行coroutines并等待全部完成

经博延
2023-03-14

我有一个viewmodel,它对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(都是挂起函数)执行此调用后,我通知livedata,但这需要一些时间(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而不是作业

共有1个答案

荆树
2023-03-14

如果所有调用的结果类型相同,则可以使用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]!!
 类似资料:
  • 本文向大家介绍java使用CountDownLatch等待多线程全部执行完成,包括了java使用CountDownLatch等待多线程全部执行完成的使用技巧和注意事项,需要的朋友参考一下 前言 CountDownLatch 允许一个或多个线程等待其他线程完成操作。 应用场景 假如有一个列表的大量数据等待处理,最后全部处理完毕后返回处理结果。普通做法就是从头遍历,一个个顺序执行,这样单线程处理效率不

  • 问题内容: 在我的Java程序中,我创建一个执行命令以运行批处理文件的过程,如下所示: 现在,我想发生的是该命令 仅在我调用的批处理文件执行完毕后运行。但是现在,它会在命令提示符打开后立即运行。 我该如何解决? 问题答案: 我设法在其他地方找到答案。要保持初始过程打开,直到批处理文件完成,您需要的是“ / wait”

  • 我编写了两个功能文件,每个功能文件打开不同的浏览器URL,例如一个是open google。com和secnd一个开放的亚马逊。但事实并非如此。 两个浏览器都打开了谷歌。通用域名格式。此外,它不能与浏览器交互,任何编码到浏览器的操作都不会执行。此外,关闭第一个浏览器会导致第二个浏览器出现空指针异常。 cucumber版本6我从AbstractCucumberTesNG继承开始。然后我创建登录。功能

  • Verticle部署是异步的,可能部署完成后才返回。 如果你想要部署完成后通知,您可以部署指定完成处理程序: vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", res -> { if (res.succeeded()) { System.out.println("Deployment id is: " + re

  • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样

  • 我试过下面的方法,但效果不理想。