Kotlin:跳过协程
Kotlin: Skipping Coroutines
我在演示 android 应用程序中使用了 Kotlin 和协程。
这是我拥有的:
fun testCoroutine3() = runBlocking {
var num = 0
val jobs = List(10_000) { // create a lot of coroutines and list their jobs.
launch(CommonPool) {
delay(1000L)
println(num++)
}
}
for(job in jobs) {
job.join() //wait for all jobs to finish
}
println("FINAL RESULT $num")
}
基本上我正在创建一个包含 10,000 个协程的列表,它们等待 1 秒并打印一个数字然后递增它。
然后当所有作业完成后,我打印最终结果。
(此demo摘自GitHub Documentation)
现在我的大部分测试运行都很好,所有协程运行几乎同时进行,我的最终结果是10000
但是在极少数情况下,我得到的最终结果是 9,999
例如,当我将数字增加到 50,000 时,这变得更加明显:
当协程很多时,Kotlin 是否可能会跳过一些协程?在 50,000 上,看起来它跳过了 2
还是这里发生了其他事情?
num++
由两个操作组成:tmp = num + 1
和 num = tmp
。在处理像您的示例这样的多线程时,某些操作可能会覆盖另一个线程的结果,从而导致出现像您的示例这样的情况。
如果您想了解更多信息,请研究 "race conditions" 最终结果取决于两个独立进程之间的 "race"。
我在演示 android 应用程序中使用了 Kotlin 和协程。
这是我拥有的:
fun testCoroutine3() = runBlocking {
var num = 0
val jobs = List(10_000) { // create a lot of coroutines and list their jobs.
launch(CommonPool) {
delay(1000L)
println(num++)
}
}
for(job in jobs) {
job.join() //wait for all jobs to finish
}
println("FINAL RESULT $num")
}
基本上我正在创建一个包含 10,000 个协程的列表,它们等待 1 秒并打印一个数字然后递增它。
然后当所有作业完成后,我打印最终结果。
(此demo摘自GitHub Documentation)
现在我的大部分测试运行都很好,所有协程运行几乎同时进行,我的最终结果是10000
但是在极少数情况下,我得到的最终结果是 9,999
例如,当我将数字增加到 50,000 时,这变得更加明显:
当协程很多时,Kotlin 是否可能会跳过一些协程?在 50,000 上,看起来它跳过了 2
还是这里发生了其他事情?
num++
由两个操作组成:tmp = num + 1
和 num = tmp
。在处理像您的示例这样的多线程时,某些操作可能会覆盖另一个线程的结果,从而导致出现像您的示例这样的情况。
如果您想了解更多信息,请研究 "race conditions" 最终结果取决于两个独立进程之间的 "race"。