协程只是完成句柄的语法糖?

协程只是完成块周围的语法糖,完成块将在引擎盖下创建? 或者,协程的概念更为复杂和广泛,只是编译器把戏又称为语法糖

这不仅仅是句法糖,根本不是。 协程并不阻塞线程,它们只是暂停执行,因此鼓励非阻塞并发编程。

协程不依赖操作系统或JVM的特性(例如,它们不映射到本地线程)。 相反,协程和suspend功能特别是由编译器生成一个状态机来转换,这个状态机一般可以处理暂停状态 ,并绕过挂起的协程来保持状态。 这是由Continuations启用的,它们作为参数被编译器添加到每个挂起函数中; 这种技术被称为“延续传球风格”。

详情请看https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md

不,协程不是语法糖。 您可以将协程作为可以与调用者交互的函数来考虑。 当你调用一个正常的函数,说foo你将控制权交给foo并且必须等到foo完成或抛出异常。 协程是可以将控制权交还给调用者的函数,调用者可以决定协程是否应该继续,协程何时以及如何继续。 这给了机会实现在其他语言的特殊语言结构的东西:

  • 生成器(aka yield关键字)就像在C#和JavaScript中一样。 当用户需要迭代器的新值时,调用者继续执行协程。 协程通过调用yield()函数返回给调用者,这也将一些值传递给调用者。
  • 异步/等待在C#和JavaScript中。 当Future(类似于Task或Promise)得到解决时,调用者继续执行。 协程通过调用await()函数返回给调用者。 当Future得到解决时,调用者将值传递给协程,并且协程通过await()调用来观察这个值。
  • Go的Goroutines /频道。

与C#,JavaScript或Go不同的是,Kotlin没有以特殊语法实现这些功能。 相反,Kotlin只提供suspend fun语法,然后你可以自己实现这些特性(或者从相应的库中获得一个名为kotlinx.coroutines )。

我建议你听听Chris Lattner(Swift的创建者)讲述未来的Swift并发模型。 链接: https : //spec.fm/podcasts/swift-unwrapped/84323

他在11:30说:

你可以把异步/等待视为完成处理程序周围的语法糖