Kotlin的‘coroutines’是否为真正协程?定义与实现辨析
Kotlin协程是否属于“真正的协程”?
Kotlin文档的《协程概述》提到“Kotlin在语言层面提供协程支持,将大部分功能委托给库实现”。但这里就有个疑问:Kotlin是否真的支持协程,还是误用了该术语?
实际上,这段文档的含义可以拆解为两点:
- 语言层面提供
suspend修饰符,编译器会将挂起函数转换为CPS(延续传递风格); kotlinx.coroutines库提供执行生成的延续链的机制。
我目前还没明确Kotlin术语中哪部分构成“协程”。现在的理解是,Kotlin将launch创建的实例称为“协程”,这也符合它“协程是轻量级线程”的宣传语。
示例代码:
suspend fun myFunction(): Unit = delay(100) someScope.launch { myFunction() } // 此代码创建一个“协程”
但这和我对其他语言协程的认知不符。基于维基百科的《协程》词条,我理解的协程是类似子例程的函数,可在任意点挂起并将控制权移交至其他任意协程。
Kotlin的用法和这个定义存在两大差异:
- Kotlin中协程是执行函数的抽象“轻量级线程”,而按我的定义,协程是函数本身;
- Kotlin的挂起函数只能将控制权交还给调用方,而协程的核心特征是可将控制权传递给其他任意协程。
因此我认为Kotlin的suspend函数实际是生成器或半协程,kotlinx.coroutines库本质上提供了蹦床机制。
基于Kotlin之外的协程术语定义,我的理解是否正确?若正确,现有语言支持能否实现更接近“真正协程”的功能,还是本质上仅局限于半协程和生成器?
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

