本文共 1140 字,大约阅读时间需要 3 分钟。
由于我仅在JVM上使用协程,因此我将讨论JVM后端,也有Kotlin本机和Kotlin JavaScript,但是这些Kotlin后端不在我的讨论范围之内。
因此,让我们开始将Kotlin协程与其他语言的协程进行比较。 基本上,您应该知道协程有两种类型:无堆栈和堆栈。 Kotlin实现了无堆栈的协程-这意味着协程没有自己的堆栈,这限制了协程的功能。 您可以在此处阅读良好的解释。
例子:
无堆栈:C#,Scala,Kotlin
大量:Quasar,Javaflow
协程就像轻量级线程一样意味着什么?
这意味着Kotlin中的协程没有自己的堆栈,它不映射在本机线程上,不需要在处理器上进行上下文切换。
有什么区别?
线程-抢先多任务。 (通常)。协程-协作多任务。
线程-由OS管理(通常)。协程-由用户管理。
Kotlin的协程实际上是并行/并发运行的吗?
这取决于您可以在自己的线程中运行每个协程,也可以在一个线程或某个固定线程池中运行所有协程。
有关协程如何在此处执行的更多信息。
即使在多核系统中,任何给定时间也只有一个协程运行(对吗?)
不,请参阅上一个答案。
在这里,我要启动100000个协程,这段代码后面会发生什么?
实际上,这取决于。 但是,假设您编写以下代码:
fun main(args: Array) {
for (i in 0..100000) {
async(CommonPool) {
delay(1000)
}
}
}
此代码立即执行。
因为我们需要等待Continuation调用的结果。
所以让我们解决这个问题:
fun main(args: Array) = runBlocking {
for (i in 0..100000) {
val job = async(CommonPool) {
delay(1)
println(i)
}
job.join()
}
}
运行此程序时,kotlin将创建2 * 100000个实例Continuation,这将占用几十Mb的RAM,在控制台中,您将看到1到100000之间的数字。
因此,让我们以这种方式重写此代码:
fun main(args: Array) = runBlocking {
val job = async(CommonPool) {
for (i in 0..100000) {
delay(1)
println(i)
}
}
job.join()
}
我们现在实现了什么? 现在,我们仅创建2700117825680458752的100001实例,这要好得多。
每个创建的Continuation将在CommonPool(ForkJoinPool的静态实例)上调度并执行。
转载地址:http://iznva.baihongyu.com/