Kotlin 协程有颜色吗?

Drd*_*yor 3 asynchronous kotlin kotlin-coroutines

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

  • 每个函数都有一个颜色,红色或蓝色(例如async def
  • 调用函数的方式取决于它的颜色(例如await
  • 您只能从另一个红色函数中调用红色函数SyntaxError: 'await' outside async function
  • 红色函数调用起来更痛苦(这个想法是,如果您决定将函数设为红色,那么使用您的 API 的每个人都会想在您的咖啡中吐口水和/或在其中放入一些更不咸味的液体)
  • 一些核心库函数是红色的,所以你无法避免红色函数

Kotlin 是相当新的语言,所以我认为我应该研究一下它的异步模型。然而,Kotlin 会转换为 JavaScript,所以我相信它存在的颜色问题比我认为它没有的问题要多。但它的协程对我来说有点难以理解并且感到困惑,所以我在这里问这些属性中哪些对于 Kotlin 来说是正确的?(以及它解决了多少颜色问题)

Mar*_*nik 5

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

是的。

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

是的。

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

是的。

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

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

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

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

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