协程只是完成处理程序周围的语法糖吗?

den*_*631 5 asynchronous coroutine async-await kotlin

协程只是完成块周围的语法糖,完成块将在幕后创建吗?或者是协程的概念比编译器技巧又名语法糖更复杂和广泛

s1m*_*nw1 5

它不仅仅是语法糖,一点也不。协程不会阻塞线程,它们只是暂停执行,因此它们鼓励非阻塞并发编程。

\n\n

协程不依赖于操作系统或 JVM 的功能(例如,它们不映射到本机线程)。相反,协程和suspend函数特别由编译器进行转换,生成一个状态机,该状态机能够处理一般的挂起并传递挂起的协程以保持其状态。这是通过Continuations启用的,编译器将其作为参数添加到每个挂起函数中;这种技术称为\xe2\x80\x9cContinuation-passing style\xe2\x80\x9d。

\n\n

有关详细信息,请查看https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md

\n

  • “Continuation”被添加到“suspend”函数中:https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#continuation-passing-style (2认同)
  • 这个概念非常古老,并不是 Kotlin 专用的。当然有许多不同的语言支持它。 (2认同)
  • 正如您可以在此处阅读的“协程的第一类激励用例是*异步计算*(由 C# 和其他语言中的 async/await 处理)”。所以是的,它是相似的。但好处是,Kotlin 不会强制执行任何特定的样式,例如 C# 中的 async/await,您也可以实现自己的东西,使用 Promise、Actor 等。这是另一个有趣的文档,我建议您:https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md (2认同)