能有人解释一下为什么人们应该使用协程吗?是否有一些协程代码示例可以显示出与常规java并发代码相比更好的完成时间(没有神奇的delay()函数,没人在生产中使用delay())?
以我的个人例子来看,协程(第1行)对于java代码(第2行)来说不怎么样。也许我做错了什么?
示例:
import kotlinx.coroutines.*
import java.time.Instant
import java.util.concurrent.CompletableFuture
import java.util.concurrent.Future
@ExperimentalCoroutinesApi
fun main() = runBlocking {
val begin = Instant.now().toEpochMilli()
val jobs = List(150_000) {
GlobalScope.launch { print(getText().await()) } // :1
// CompletableFuture.supplyAsync { "." }.thenAccept { print(it) } // :2
}
jobs.forEach { it.join() }
println(Instant.now().toEpochMilli() - begin)
}
fun getText(): Future<String> {
return CompletableFuture.supplyAsync {
"."
}
}
@ExperimentalCoroutinesApi
suspend fun <T> Future<T>.await(): T = suspendCancellableCoroutine { cont ->
cont.resume(this.get()) {
this.cancel(true)
}
}
补充问题:
为什么我需要创建这个协程包装器await()
?否则,如果使用get()
方法,它会产生inappropriate blocking method call
的警告,但似乎并没有提高协程版本的代码效率?
delay()
实际上是生产代码的一个很好的近似,因为协程在等待响应返回时会被暂停。这里有一个不错的总结:使用线程来并行处理工作,使用协程来并行等待。 - Marko Topolnik