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认同)

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

  1. python协程和线程_线程和协程之间的区别

    线程和协程之间的区别很大,甚至大过进程和线程之间的区别.线程建立在进程之上,协程建立在线程之上.那么协程是什么呢? 协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复.协程非常适 ...

  2. java协程和线程_Kotlin中的线程和协程之间的区别

    由于我仅在JVM上使用协程,因此我将讨论JVM后端,也有Kotlin本机和Kotlin JavaScript,但是这些Kotlin后端不在我的讨论范围之内. 因此,让我们开始将Kotlin协程与其他语 ...

  3. 进程、线程和协程之间的区别和联系

    文章目录 一.进程 二.线程 三.进程和线程的区别与联系 四.一个形象的例子解释进程和线程的区别 五.进程/线程之间的亲缘性 六.协程 一.进程   进程,直观点说,保存在硬盘上的程序运行以后,会在内 ...

  4. oracle pga的作用,浅析Oracle中PGA和UGA两者间的区别

    初学Oracle时,你可能会对Oracle中PGA和UGA两者间的区别产生疑问,这里就PGA和UGA两者间的区别发表下个人意见,在这里拿出来和大家分享一下. The Process Memory除SG ...

  5. linux子线程运行的函数_Linux中线程使用详解

    4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...

  6. python协程和线程区别_python中的线程和协程之间有什么区别

    一.首先我们来了解一下线程和协程的概念1.线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源( ...

  7. java中线程池的使用_Java中线程池的简单使用

    什么是线程池? 顾名思义线程池就是线程的容器 举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源:但是现在共享电 ...

  8. 请你说说进程、线程、纤程之间的区别?

    其他链接:JAVA相关的深度技术博客链接 相信很多小伙伴们在面试的时候,面试官都会提这样的一个问题. 请你说说什么是进程,什么是线程,两者有什么区别? 很多小伙伴可能会直接说,进程就是一个个后台程序, ...

  9. python 协程、进程、线程_Python进程、线程、协程之间的关系

    一.从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 . 1.进程: 表示一个程序的执行活动 (打开程序.读写程序数据.关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 ...

最新文章

  1. [微信小程序]提交表单返回成功后自动清空表单的值
  2. 设计模式-Strategy模式
  3. linux下磁盘高级工具,Linux命令行工具-di
  4. 下载Java Jar包的网站(托管厂库)
  5. 天津市电子计算机职业学院,天津市电子计算机职业中等专业学校
  6. C语言为四维数组申请动态内存空间的方法(二)
  7. java+icepdf+下载_Java使用icepdf将pdf文件按页转成图片
  8. CPLEX——关键字
  9. 继承ActionSupport例子展示
  10. CMakeLists.txt文本编辑工具
  11. 超赞Win10日历悬停效果,爱了爱了(使用HTML、CSS和vanilla JS)
  12. python对文本文件的读写
  13. 字节跳动测试岗位面试题
  14. 使用接口测试活动的中奖概率(随机事件测试)
  15. 【Python】random.randint()用法
  16. 百万CT网上卖,东软医疗这样推动行业阳光采购
  17. 数学分析教程史济怀练习16.3
  18. Mac安装微信支付安全控件问题
  19. 解决chrome主页被hao123劫持的记录
  20. 软件测试工作怎么样?转行可以干什么?

热门文章

  1. 【Android 系统】---Android代号、标记、细分版本号
  2. 视频帧数据用硬件编码输出,仅仅使用FFMPEG将硬件编码出的数据推流RTSP数据后严重花屏且画面卡住不动
  3. 【教程】将自己的APP部署到阿里云
  4. TextView两端对齐
  5. 让ffmpeg支持rmvb
  6. mysql 多租户_动态路由数据源(多租户)解决方案
  7. nacos 连接不上mysql
  8. 计蒜客-20 islands 炉石传说
  9. CSS background-color、background-image、background-repeat、background-position、backgroundsize……
  10. Win11右键菜单修改为Win10右键风格