Kotlin 协程是彩色的吗?

Are Kotlin coroutines colored?

关于许多语言的异步编程模型状态的一些著名 article 指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步.以下是这种语言的属性:

Kotlin 是一种非常新的语言,所以我想我应该研究一下它的异步模型。然而,Kotlin 转译为 JavaScript,所以我相信它有颜色问题,而不是我认为没有。但是它的协程对我来说有点难以理解并且很困惑,所以我在这里问 Kotlin 的哪些属性是正确的? (以及它解决了多少颜色问题).

  • 每个函数都有颜色,红色或蓝色(例如 async def)

是的。

  • 调用函数的方式取决于它的颜色(例如 await)

是的。

  • 您只能从另一个红色函数中调用红色函数

是的。

  • 一些核心库函数是红色的

是的,但他们是来帮助您处理红色功能业务的。您永远不会被迫使用它们来获得一些基本功能。

  • 红色函数调用起来比较痛苦

也是如此,但是有很多支持可以让痛苦变得很低。您可以在任何地方使用 runBlocking { } 来“进入红色世界”,并且您可以通过编写 suspend fun main() 将入口点本身着色为红色。 Kotlin 的另一个不错的选择,在许多其他语言中没有看到,是函数本身内置了类似 await 的行为,您不必编写 myFunction().await().

在实践中,Kotlin Coroutines 最痛苦的方面是它们无法从底层 API 中移除阻塞。例如,很容易使用阻塞的 Java 文件 IO,并冻结使用同一线程的所有其他协程的进度。编译器也很难确定您何时执行此操作,因此您很难找到它。

我认为 Kotlin 挂起函数介于蓝色和红色之间。它们是同步调用的并且非常容易使用,所以它们就像蓝色,但它们只能从其他挂起函数中轻松调用 - 所以红色。

请注意,将红色函数添加到语言中并非没有原因。这个原因就是性能。我们可以用纯蓝色函数做任何事情,但它不会像使用红色函数那样快。

我认为 Kotlin 协程或其他语言的类似解决方案最终可能会解决颜色问题。不是全蓝,而是相反:全红。或者任何真正的暂停功能。如果我们让整个代码库保持可挂起状态,那么我们将获得性能优势,并且我们编写的代码就像蓝色一样。

不幸的是,我想我们要花很多时间才能到达那里。我们基本上需要打破与所有现有蓝色库的兼容性。这是昂贵的。