Kotlin 不可预知的协同程序执行顺序?

Kotlin 不可预知的协同程序执行顺序?,kotlin,kotlinx.coroutines,Kotlin,Kotlinx.coroutines,我是这样想的: 当使用协程时,你会堆积异步操作,一旦你完成了同步操作,按FIFO顺序调用它们,但这并不总是正确的 在本例中,您得到了我期望的结果: fun main() = runBlocking { launch { println("1") } launch { println("2") } println("0") } 还包括: fun main() = runBlocking { launch { printl

我是这样想的: 当使用协程时,你会堆积异步操作,一旦你完成了同步操作,按FIFO顺序调用它们,但这并不总是正确的

在本例中,您得到了我期望的结果:

fun main() = runBlocking {
   launch {
      println("1")
   }

   launch {
      println("2")
   }

   println("0")
}
还包括:

fun main() = runBlocking {
   launch {
      println("1")
   }

   launch {
      launch {
         println("3")
      }

      println("2")
   }

   println("0")
}
现在,在这个例子中,使用一个范围构建器并创建另一个Pileno不是真正的术语,顺序改变了,但仍然..您得到了预期的结果

fun main() = runBlocking {
   launch {
      println("2")
   }

   // replacing launch
   coroutineScope {
      println("0")
   }

   println("1")
}
最后..这个问题的原因..使用scope builder的示例2:

fun main() = runBlocking {
   launch {
      println("3")
   }

   coroutineScope {
      launch {
         println("1")
      }

      println("0")
   }

   println("2")
}
我明白了: 0 3. 1. 二,

为什么

我的假设是错误的,这不是协同程序的工作方式吗

如果是,那么在编码时我应该如何确定正确的顺序

编辑:我曾尝试在不同的机器和不同的平台上运行相同的代码,但总是得到相同的结果。我还尝试了更复杂的嵌套来证明结果的不可变性

挖掘文档发现,协同程序只是我最初认为的代码转换

请记住,即使用户喜欢称它们为“轻量级”线程,它们也在单个“真实”线程中运行注意:没有newSingleThreadContext

因此,我选择相信执行顺序是在编译时预先确定的,而不是在运行时确定的


毕竟..我仍然无法预测顺序..这就是我想要的

不要假设协同程序将以特定的顺序运行,运行时将决定何时以何种顺序运行最好。你可能会感兴趣,这将有帮助的是。它很好地解释了它们是如何工作的,还提供了一些方便的抽象,以帮助管理协同程序变得更有意义。我个人建议退房,然后

例如,如果我希望事情按数字顺序完成,我会使用通道来确保事情按我想要的顺序到达

runBlocking {
    val channel = Channel<Int>()
    launch {
        for (x in 0..5) channel.send(x * x)
        channel.close()
    }

    for (msg in channel) {
        // Pretend we're doing some work with channel results
        println("Message: $msg")
    }
}
希望这能给你提供更多的上下文,或者协同程序是什么,它们有什么好处