Kotlin 协程是彩色的吗?
Are Kotlin coroutines colored?
关于许多语言的异步编程模型状态的一些著名 article 指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步.以下是这种语言的属性:
- 每个函数都有颜色,红色或蓝色(例如
async def
)
- 调用函数的方式取决于它的颜色(例如
await
)
- 您只能从另一个红色函数中调用红色函数、
SyntaxError: 'await' outside async function
- 红色函数调用起来更痛苦(这个想法是,如果你决定把一个函数变成红色,每个使用你的API的人都会想吐你的咖啡 and/or 在里面放一些味道更差的液体)
- 一些核心库函数是红色的,所以你无法避免红色函数
Kotlin 是一种非常新的语言,所以我想我应该研究一下它的异步模型。然而,Kotlin 转译为 JavaScript,所以我相信它有颜色问题,而不是我认为没有。但是它的协程对我来说有点难以理解并且很困惑,所以我在这里问 Kotlin 的哪些属性是正确的? (以及它解决了多少颜色问题).
- 每个函数都有颜色,红色或蓝色(例如 async def)
是的。
- 调用函数的方式取决于它的颜色(例如 await)
是的。
- 您只能从另一个红色函数中调用红色函数
是的。
- 一些核心库函数是红色的
是的,但他们是来帮助您处理红色功能业务的。您永远不会被迫使用它们来获得一些基本功能。
- 红色函数调用起来比较痛苦
也是如此,但是有很多支持可以让痛苦变得很低。您可以在任何地方使用 runBlocking { }
来“进入红色世界”,并且您可以通过编写 suspend fun main()
将入口点本身着色为红色。 Kotlin 的另一个不错的选择,在许多其他语言中没有看到,是函数本身内置了类似 await
的行为,您不必编写 myFunction().await()
.
在实践中,Kotlin Coroutines 最痛苦的方面是它们无法从底层 API 中移除阻塞。例如,很容易使用阻塞的 Java 文件 IO,并冻结使用同一线程的所有其他协程的进度。编译器也很难确定您何时执行此操作,因此您很难找到它。
我认为 Kotlin 挂起函数介于蓝色和红色之间。它们是同步调用的并且非常容易使用,所以它们就像蓝色,但它们只能从其他挂起函数中轻松调用 - 所以红色。
请注意,将红色函数添加到语言中并非没有原因。这个原因就是性能。我们可以用纯蓝色函数做任何事情,但它不会像使用红色函数那样快。
我认为 Kotlin 协程或其他语言的类似解决方案最终可能会解决颜色问题。不是全蓝,而是相反:全红。或者任何真正的暂停功能。如果我们让整个代码库保持可挂起状态,那么我们将获得性能优势,并且我们编写的代码就像蓝色一样。
不幸的是,我想我们要花很多时间才能到达那里。我们基本上需要打破与所有现有蓝色库的兼容性。这是昂贵的。
关于许多语言的异步编程模型状态的一些著名 article 指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步.以下是这种语言的属性:
- 每个函数都有颜色,红色或蓝色(例如
async def
) - 调用函数的方式取决于它的颜色(例如
await
) - 您只能从另一个红色函数中调用红色函数、
SyntaxError: 'await' outside async function
- 红色函数调用起来更痛苦(这个想法是,如果你决定把一个函数变成红色,每个使用你的API的人都会想吐你的咖啡 and/or 在里面放一些味道更差的液体)
- 一些核心库函数是红色的,所以你无法避免红色函数
Kotlin 是一种非常新的语言,所以我想我应该研究一下它的异步模型。然而,Kotlin 转译为 JavaScript,所以我相信它有颜色问题,而不是我认为没有。但是它的协程对我来说有点难以理解并且很困惑,所以我在这里问 Kotlin 的哪些属性是正确的? (以及它解决了多少颜色问题).
- 每个函数都有颜色,红色或蓝色(例如 async def)
是的。
- 调用函数的方式取决于它的颜色(例如 await)
是的。
- 您只能从另一个红色函数中调用红色函数
是的。
- 一些核心库函数是红色的
是的,但他们是来帮助您处理红色功能业务的。您永远不会被迫使用它们来获得一些基本功能。
- 红色函数调用起来比较痛苦
也是如此,但是有很多支持可以让痛苦变得很低。您可以在任何地方使用 runBlocking { }
来“进入红色世界”,并且您可以通过编写 suspend fun main()
将入口点本身着色为红色。 Kotlin 的另一个不错的选择,在许多其他语言中没有看到,是函数本身内置了类似 await
的行为,您不必编写 myFunction().await()
.
在实践中,Kotlin Coroutines 最痛苦的方面是它们无法从底层 API 中移除阻塞。例如,很容易使用阻塞的 Java 文件 IO,并冻结使用同一线程的所有其他协程的进度。编译器也很难确定您何时执行此操作,因此您很难找到它。
我认为 Kotlin 挂起函数介于蓝色和红色之间。它们是同步调用的并且非常容易使用,所以它们就像蓝色,但它们只能从其他挂起函数中轻松调用 - 所以红色。
请注意,将红色函数添加到语言中并非没有原因。这个原因就是性能。我们可以用纯蓝色函数做任何事情,但它不会像使用红色函数那样快。
我认为 Kotlin 协程或其他语言的类似解决方案最终可能会解决颜色问题。不是全蓝,而是相反:全红。或者任何真正的暂停功能。如果我们让整个代码库保持可挂起状态,那么我们将获得性能优势,并且我们编写的代码就像蓝色一样。
不幸的是,我想我们要花很多时间才能到达那里。我们基本上需要打破与所有现有蓝色库的兼容性。这是昂贵的。