为什么这个协程演示崩溃了?

时间:2019-11-27 05:23:50

标签: kotlin kotlin-coroutines

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上运行它。

我想了解我在做什么错。 我的意图是创建一个程序来了解我们可以创建多少个协程。

在程序结束之前,我的机器重新启动。

1 个答案:

答案 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

请注意,所有这些协程都在主线程上执行,这就是为什么我不需要线程安全计数器的原因。