【发布时间】:2019-08-24 18:52:57
【问题描述】:
我是 Kotlin 和协程的新手,我正在尝试理解协程 API,所以很可能我做错了什么。所以我有一些对象的列表,我正在尝试对这些对象中的每一个应用一些长时间运行的处理。
val listOfFoos = listOf(Foo(1), ..., Foo(n))
listOfFoos.forEach { longRunningJob(it) }
fun longRunningJob(foo: Foo) {
runBlocking{
delay(2000) //hardcoded delay for testing
}
//do something else
}
当然,这是并发运行它的完美候选,所以这里使用了良好的旧线程:
listOfFoos.map { thread(start = true) { longRunningJob(it) } }.forEach { it.join() }
当我使用 measureTimeMillis 测量它的执行时间时,它给了我大约 2 秒,这似乎非常好,因为每个 longRunningJob 并行运行。
但是协程要好得多,因为它没有上下文切换的线程这样的开销。所以这是我使用协程的实现:
val deferredResults =
listOfFoos.map { GlobalScope.async { longRunningJob(it) } }
runBlocking {
deferredResults.awaitAll()
}
但是这个实现在大约 4 秒内完成了执行,这根本不是我所期望的,如果我向列表中添加更多元素,执行时间也会增加。
那么我在这里做错了什么?
【问题讨论】:
标签: kotlin concurrency coroutine kotlin-coroutines