import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
fun main() {
coroutines()
while (true) {
}
}
fun coroutines() {
val jobs = 1..100000
jobs.forEach {
GlobalScope.launch(Dispatchers.IO) {
val request = getRequest()
val client = getClient()
call(request, client)
}
}
}
我正在High Sierra的16GB RAM上运行它。
我想了解我在做什么错。 我的意图是创建一个程序来了解我们可以创建多少个协程。
在程序结束之前,我的机器重新启动。
答案 0 :(得分:0)
我的意图是创建一个程序来了解我们可以创建多少个协程。
您编写的程序无法为您提供答案。相反,它在经典Java ExecutorService
的顶部放置了一个薄层,最多有64个并发线程执行您的call()
。您的计算机重新启动的原因完全超出了您在问题中发布的代码范围。这可能与您的call()
的确切行为有关。
如果要观察Kotlin协程所带来的开销,则必须编写不涉及开销超过协程的重量级操作的代码。这是一个示例:
var maxConcurrentCalls = 0
fun main() {
runBlocking {
coroutines()
}
println("You launched %,d concurrent coroutines".format(maxConcurrentCalls))
}
fun CoroutineScope.coroutines() {
var concurrentCalls = 0
val jobs = 1..1_000_000
jobs.forEach {
launch {
concurrentCalls++
maxConcurrentCalls = max(concurrentCalls, maxConcurrentCalls)
delay(1000)
concurrentCalls--
}
}
}
在我的计算机上,它运行了大约3秒钟并打印了
You launched 1,000,000 concurrent coroutines
请注意,所有这些协程都在主线程上执行,这就是为什么我不需要线程安全计数器的原因。