kotlin 子线程睡3秒_Kotlin中线程和协程之间的区别

本文探讨了Kotlin协程的特性,将其与无堆栈和堆栈协程进行比较,并分析了Kotlin协程与线程的区别。文中通过示例展示了如何在Kotlin中使用协程进行并发操作,强调了协程的轻量级特性以及如何避免内存消耗。此外,还讨论了Kotlin协程在多核系统中的执行情况,以及如何优化协程的使用以减少资源占用。
摘要由CSDN通过智能技术生成

Ruslan..

47

由于我只在JVM上使用协同程序,我将讨论JVM后端,还有Kotlin Native和Kotlin JavaScript,但Kotlin的这些后端超出了我的范围.

让我们首先将Kotlin协程与其他语言协程进行比较.基本上,你应该知道有两种类型的协同程序:无堆栈和堆栈.Kotlin实现了无堆栈协程 - 这意味着协程没有自己的堆栈,这限制了协同程序可以做的一点点.你可以在这里阅读一个很好的解释.

例子:

Stackless:C#,Scala,Kotlin

Stackful:Quasar,Javaflow

coroutine就像轻量级线程一样意味着什么?

这意味着Kotlin中的协程没有自己的堆栈,它不映射到本机线程,它不需要在处理器上进行上下文切换.

有什么不同?

线程 - 抢先式多任务处理.(通常).协同 - 合作多任务.

线程 - 由OS(通常)管理.协同程序 - 由用户管理.

kotlin的协程实际上并行/同时运行吗?

这取决于你可以在自己的线程中运行每个协同程序,或者你可以在一个线程或一些固定的线程池中运行所有协同程序.

更多关于coroutines如何在这里执行.

即使在多核系统中,在任何给定时间只有一个协程运行(是不是?)

不,请看上一个答案.

在这里,我将启动100000个协程,这段代码背后会发生什么?

实际上,这取决于.但假设您编写以下代码:

fun main(args: Array) {

for (i in 0..100000) {

async(CommonPool) {

delay(1000)

}

}

}

此代码立即执行.

因为我们需要等待async来电的结果.

所以让我们解决这个问题:

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()

}

我们现在取得了什么?现在我们只创建了100001个实例Continuation,这要好得多.

每个创建的Continuation都将在CommonPool(这是ForkJoinPool的静态实例)上调度和执行.

很好的答案,但我建议做一个重要的修正.Kotlin中的协程_在初始预发布预览中用于无堆叠,但实际上是在Kotlin 1.1中发布的,支持任何堆叠深度的悬浮,就像在Quasar中一样.对于那些熟悉Quasar的人来说,很容易看到Quasar的`throws SuspendExecution`和Kotlin的`suspend`修饰符之间的一对一对应关系.当然,实现细节是完全不同的,但用户体验非常相似. (12认同)

我将以下列方式对各种语言的协程进行分类:C#,JS等具有基于_future/promise的coroutines_.这些语言中的任何异步计算都必须返回某种类似未来的对象.把它们称为无堆栈是不公平的.你_can_表达任何深度的异步计算,它只是在语法和实现方面效率低下.Kotlin,Quasar等都有_suspension/continuation-based coroutines_.它们更加强大,因为它们可以与未来类似的对象一起使用,也可以不使用它们,仅使用挂起功能. (8认同)

也欢迎您签出相应的[设计文件]在实际执行科特林协同程序的细节(https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md). (5认同)

好.这是一篇很好的论文,给出了协程的背景,并给出了"堆栈协程"的或多或少精确的定义:http://www.inf.puc-rio.br/~roberto/docs/MCC15-04.pdf它意味着Kotlin实现_stackful coroutines_. (4认同)

坦率地说,我不知道"堆叠协程"这个词是什么意思.我没有看到这个术语的任何正式/技术定义,我看到不同的人以完全矛盾的方式使用它.我完全避免使用术语"堆叠协程".我可以肯定地说,而且很容易验证的是,Kotlin协程与Quasar更接近并且与C#不同.无论你对"堆叠协同程序"一词的具体定义如何,将Kotlin corutines放入与C#异步相同的bin中似乎并不正确. (3认同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值