opoojkk

协程和Kotlin协程

xx
目次

协程到底是什么呢?

这是我看到Kotlin协程之后的第一个问题。在回答是不是什么之前,先弄清楚什么是怎么定义的,协程也是一样。

在搜索引擎得到的答案都是"轻量化线程"、“非阻塞”、“协作式"之类的关键字关键字,真的是这样吗?

协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。

摘自wikipedia

维基百科的解释是这样的,看上去好像也不能理解是什么。

维基百科的优点是会给出来源,协程最初被提出是在1963年。按照网络上的说法,线城市60年代后期出现了,按照这个说法,线程出现比协程要晚。因此,“轻量化线程"看起来不能成立。

在原始的论文中,作者表述的是一种没有主程序控制,由多段不同的协程控制的程序,子程序之间没有父子关系都是并列的。

但是被认为是协程里程碑的则是另一篇《Coroutines: A Programming Methodology, a Language Design and an Implementation》。

其中表述的概念是说协程是非抢占式的。抢占式指操作系统强制终端当前的任务,将CPU分配给其他任务,而协程不一样,是通过主动让出CPU,这时候才会切换至其他任务。最常见的场景恐怕是IO操作上,当需要切换线程时,不是由操作系统完成,而是有程序员主动执行,让正在执行IO操作的线程让出CPU。

协程是一个概念。无论是操作系统实现,还是语言实现,亦或是一个封装好的三方库,只要符合概念,通通都可以认为是协程。因此朱凯的理论"因为JVM没实现,所以不是真的协程"并不能让人信服。

再到Kotlin的协程,Kotlin的协程实现了上面的概念了吗,我想是没有的,Kotlin的协程在使用的时候看起来是切换了线程,实际上是在主线程、IO线程池和耗时运算线程池之间切换,没有释放出正在IO等待的线程的CPU。

从这个角度看,的确不是协程,但不妨碍它的名字叫Kotlin协程。

参考 #

标签:
Categories: