首页 > 编程知识 正文

kotlin协程和go协程的区别,kotlin 线程

时间:2023-05-05 07:49:51 阅读:275054 作者:494

由于我仅在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的静态实例)上调度并执行。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。