kotlin 子线程睡3秒_Kotlin中线程和协程之间的区别
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中线程和协程之间的区别相关推荐
- python协程和线程_线程和协程之间的区别
线程和协程之间的区别很大,甚至大过进程和线程之间的区别.线程建立在进程之上,协程建立在线程之上.那么协程是什么呢? 协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复.协程非常适 ...
- java协程和线程_Kotlin中的线程和协程之间的区别
由于我仅在JVM上使用协程,因此我将讨论JVM后端,也有Kotlin本机和Kotlin JavaScript,但是这些Kotlin后端不在我的讨论范围之内. 因此,让我们开始将Kotlin协程与其他语 ...
- 进程、线程和协程之间的区别和联系
文章目录 一.进程 二.线程 三.进程和线程的区别与联系 四.一个形象的例子解释进程和线程的区别 五.进程/线程之间的亲缘性 六.协程 一.进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内 ...
- oracle pga的作用,浅析Oracle中PGA和UGA两者间的区别
初学Oracle时,你可能会对Oracle中PGA和UGA两者间的区别产生疑问,这里就PGA和UGA两者间的区别发表下个人意见,在这里拿出来和大家分享一下. The Process Memory除SG ...
- linux子线程运行的函数_Linux中线程使用详解
4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...
- python协程和线程区别_python中的线程和协程之间有什么区别
一.首先我们来了解一下线程和协程的概念1.线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源( ...
- java中线程池的使用_Java中线程池的简单使用
什么是线程池? 顾名思义线程池就是线程的容器 举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源:但是现在共享电 ...
- 请你说说进程、线程、纤程之间的区别?
其他链接:JAVA相关的深度技术博客链接 相信很多小伙伴们在面试的时候,面试官都会提这样的一个问题. 请你说说什么是进程,什么是线程,两者有什么区别? 很多小伙伴可能会直接说,进程就是一个个后台程序, ...
- python 协程、进程、线程_Python进程、线程、协程之间的关系
一.从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 . 1.进程: 表示一个程序的执行活动 (打开程序.读写程序数据.关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 ...
最新文章
- [微信小程序]提交表单返回成功后自动清空表单的值
- 设计模式-Strategy模式
- linux下磁盘高级工具,Linux命令行工具-di
- 下载Java Jar包的网站(托管厂库)
- 天津市电子计算机职业学院,天津市电子计算机职业中等专业学校
- C语言为四维数组申请动态内存空间的方法(二)
- java+icepdf+下载_Java使用icepdf将pdf文件按页转成图片
- CPLEX——关键字
- 继承ActionSupport例子展示
- CMakeLists.txt文本编辑工具
- 超赞Win10日历悬停效果,爱了爱了(使用HTML、CSS和vanilla JS)
- python对文本文件的读写
- 字节跳动测试岗位面试题
- 使用接口测试活动的中奖概率(随机事件测试)
- 【Python】random.randint()用法
- 百万CT网上卖,东软医疗这样推动行业阳光采购
- 数学分析教程史济怀练习16.3
- Mac安装微信支付安全控件问题
- 解决chrome主页被hao123劫持的记录
- 软件测试工作怎么样?转行可以干什么?
热门文章
- 【Android 系统】---Android代号、标记、细分版本号
- 视频帧数据用硬件编码输出,仅仅使用FFMPEG将硬件编码出的数据推流RTSP数据后严重花屏且画面卡住不动
- 【教程】将自己的APP部署到阿里云
- TextView两端对齐
- 让ffmpeg支持rmvb
- mysql 多租户_动态路由数据源(多租户)解决方案
- nacos 连接不上mysql
- 计蒜客-20 islands 炉石传说
- CSS background-color、background-image、background-repeat、background-position、backgroundsize……
- Win11右键菜单修改为Win10右键风格