Kotlin协同程序与Dart中的异步等待程序有何不同



Dart使异步编程变得非常容易。您所需要做的就是将异步代码包围在async方法中,并在其中,在每次需要一段时间的调用之前使用await

我是Kotlin的新手,异步编程在这里似乎并没有那么简单。(可能是因为Dart是单线程的。)

如果能大致了解两种语言在异步代码实现方面的差异,那就太好了。

如果我遗漏了任何事实,请道歉。提前感谢!

Dart使异步编程变得非常容易。您所需要做的就是将异步代码封装在async方法中,并在其中,在每次需要一段时间的调用之前使用await

是的(尽管async+await不是Dart的发明,但它至少可以追溯到2012年的C#5.0,当时它直接启发了JavaScript、Python、Julia、Kotlin、Swift、Rust、许多其他人、Dart)。

我是Kotlin的新手,异步编程在这里似乎没有那么简单。

Kotlin 1.1有async+await,尽管await是一个后缀方法,与大多数其他语言不同,它不是一个运算符,但最终结果是一样的。

如果能大致了解两种语言在异步代码实现方面的差异,那就太好了。

Kotlin和Dart是不同的语言,因为它们解决了不同的问题,因此关于它们的差异有太多的东西要写,即使完全专注于它们如何处理并发和协同程序。


。。。但简而言之,主要的区别(就你而言)是语法上的(据我所知,这是:请注意,我不是Dart/Flutter或Kotlin专家,我只知道如何阅读文档和使用谷歌)

我建议在Kotlin中看到一些简单的例子,例如:

  • 首先,阅读将await引入Kotlin 1.1的公告:https://kotlinlang.org/docs/whatsnew11.html#coroutines-实验性的
  • 在这里查看它如何与Swift的async+await函数互操作:https://kotlinlang.org/docs/whatsnew1530.html#experimental-互操作性-与-swift5-5-async-await(据我所知,swift的异步功能与Dart的工作方式相同,只是没有强制的线程隔离)
  • Kotlin推论异步等待序列
  • 这篇文章(我只是略读了一下)看起来也不错:https://www.raywenderlich.com/books/kotlin-coroutines-by-tutorials/v2.0/chapters/5-async-await

我是Kotlin的新手,异步编程在这里似乎并不那么简单。

事实上,Kotlin将它提升到了一个新的简单级别:它几乎是看不见的。例如:

suspend fun main() {
println("Hello")
delay(1000)
println("Hello again")
}

在您不知情的情况下,这段代码实际上是异步实现的。但您只看到简单的顺序代码。编译后的代码(在JVM后端的情况下)具有如下结构:

public static void main(String[] args) {
System.out.println("Hello");
globalThreadPool.scheduleAfterDelay(() -> { 
println("Hello again");
}, 1000, TimeUnit.MILLISECONDS);
}

除此之外,Kotlin使您可以非常简单地调整现有的任何异步代码,以便您可以以与上述内置delay函数相同的本地方式使用。

人们最头疼的不是这个基本场景,而是处理更高级的主题,如结构化并发、选择正确的线程池来运行代码、错误传播等等

我没有研究过Dart,但根据我对其他语言中异步等待模式的了解,每当你调用async函数时,你都会隐式地创建一个并发任务,这很容易泄露出去——只需要忘记上面的await。Kotlin通过设计防止了这些坏结果,并迫使你正面解决你正在创建的并发问题,而不是从生产中删除内存不足的日志。

除了语法之外,最重要的区别是这些语言的多线程模型。

查看本文:

Dart支持使用Isolates的多线程。在Isolates的引言中,有人说隔离是独立的工作程序,类似于线程,但不共享内存,仅通过消息进行通信。

而Kotlin(在JVM上)在后台使用Java线程,这些线程可以访问共享内存。


async/await在两种语言中的实现大致相同,使用CPS(光荣回调)。重要的区别是,在Dart中,您有单线程事件循环调度这些回调,而在JVM上的Kotlin中,您可以让多个事件调度协同工作,并在不同的线程上真正并行运行和共享内存的continuations(回调),由此带来的所有好处和问题。

另外,请注意,Kotlin的目标是成为一种多平台语言,所以在JVM上它有多线程模型,如果您将Kotlin程序编译到JS后端,它将是带事件循环的单线程,基本上与Dart相同。


p。S.观看来自Roman Elizarov(科特林协同程序的设计师)的这段视频,它对协同程序的使用和内部有一个很好的概述。

最新更新