【问题标题】:Why is this coroutines demo crashing?为什么这个协程演示会崩溃?
【发布时间】:2019-11-27 05:23:50
【问题描述】:
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)
        }
    }
}

我在 16GB RAM,High Sierra 上运行它。

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

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

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    我的目的是创建一个程序来了解我们可以创建多少协程。

    您编写的程序没有为您提供那个答案。相反,它在经典的 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多