kotlin - Kotlin:在列表 “in parallel”上应用暂停功能?

标签 kotlin concurrency parallel-processing kotlin-coroutines suspend

如果我有一个List<A>和一个函数suspend (A) -> B,如何在列表上并行应用此函数?

最佳答案

您可以在CoroutineScope上创建扩展功能,遍历列表的每个元素并为每个元素启动协程。这样,列表中的元素将被并行处理。一些代码片段:

fun CoroutineScope.processListInParallel(list: List<A>): List<Deferred<B>> = list.map {
    async { // launch a coroutine
        processA(it)
    }
}

GlobalScope.launch {
    val list = listOf(A("name1"), A("name2"), A("name3"))
    val deferredList = processListInParallel(list)
    val results: List<B> = deferredList.awaitAll() // wait for all items to be processed
}

suspend fun processA(a: A): B {
    delay(1000) // emulate suspension
    return B("Result ${a.name}")
} 

data class A(val name: String) {}
data class B(val name: String) {}
注意:此处以GlobalScope为例,使用时高度为discouraged,应用程序代码通常应使用应用程序定义的 CoroutineScope

关于kotlin - Kotlin:在列表 “in parallel”上应用暂停功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63216511/

相关文章:

android - 在 Kotlin 中使用 FirebaseListAdapter

java - 多线程等待批量操作

java - 同步(oswego)与锁定(JDK5)

scala - 永远不会完成的 future

java - 在运行 JUnit/TestNG 测试套件时,是否有任何*真正的*解决方案来利用多核?

c++ - 是否有任何不关注 Java 的优秀并发/并行书籍?

kotlin - 为什么要将val或var放在kotlin类构造函数中

rx-java - Kotlin 和 RxJava - 为什么我的 Single.zip() 没有编译?

kotlin - 如何将 Kotlin ByteArray 转换为 NsData,反之亦然

multithreading - 我应该并行化多少代码执行?