Dart是单线程的,但为什么它使用Future对象并执行异步操作

时间:2018-10-27 07:39:00

标签: multithreading dart flutter

在文档中,Dart是单线程的,但是为了一次执行两项操作,我们使用了与线程相同的将来对象。

  

使用Future对象(期货)执行异步操作。

如果Dart是单线程的,那么为什么它允许执行异步操作。 **注意:**异步操作是并行操作,称为线程

5 个答案:

答案 0 :(得分:4)

为什么?因为这是必须的。某些操作(例如http请求或计时器)本质上是异步的。

有些隔离允许您在不同的进程中执行代码。与其他编程语言中的线程的区别在于,隔离体不会彼此共享内存(这会导致并发问题),它们仅通过消息进行通信。

Dart使用事件循环来接收这些消息(或包装在Future中,作为结果)。

答案 1 :(得分:1)

您提到了:

  

异步操作是称为线程的并行操作

首先,异步操作不是完全并行,甚至不是并发。它仅表示我们不想阻塞执行流(线程)或等待响应完成某些工作。但是我们实现异步操作的方式可以决定它是并行的还是并发的。

并行性与并发性?

  

平行主义实际上是在   同时。前-您正在散步,同时正在消化   你吃两项任务完全并行运行,并且恰好在   同时。

  

并发是并行的错觉,任务似乎已执行   平行,但事实并非如此。就像一次要处理很多事情,但   在特定时间只能完成一项任务。前-您正在行走,突然停下来系紧您的表演蕾丝。系好鞋带后,您又可以开始行走了。

现在进入Dart,Future对象与asyncawait关键字一起用于执行异步任务。这里异步并不意味着任务将彼此并行或并发执行。相反,在Dart中,甚至异步任务都在同一线程上执行,这意味着在我们等待另一个任务完成时,我们将继续执行同步代码。 Future对象用于表示将来在某个时候完成的任务的结果。

如果您想真正地同时执行任务,请考虑使用Isolates(在单独的线程中运行,并且不与主线程(或生成线程)共享内存。

答案 2 :(得分:1)

以下是一些注意事项:

  • 异步并不意味着多线程。这意味着代码不会同时运行。通常异步只是意味着它计划在其他任务完成之后在同一线程(隔离)上运行。
  • Dart实际上不是单线程的。您可以通过创建另一个隔离来创建另一个线程。但是,在隔离中,Dart代码在单个线程上运行,并且单独的隔离不共享内存。他们只能通过消息进行交流。
  • Future表示将来某个时候将返回值(或错误)。它没有说工作在哪个线程上完成。大多数期货都在当前的隔离中完成,但是某些期货(例如IO)可以在单独的线程上完成。

有关更多资源的链接,请参见this answer

答案 3 :(得分:0)

Dart 是单线程的,但是它可以调用本地代码(如 c/c++)来执行异步操作,这会引入新的线程。

在 Flutter 中,Flutter 引擎是用 C++ 实现的,它提供 Flutter 核心 API 的底层实现,包括通过底层新线程的文件和网络 I/O 等异步任务。 enter image description here

和 Dart 一样,JavaScript 也是单线程的,我发现这个视频对理解“单线程”很有帮助。 what the heck is event loop

答案 4 :(得分:-1)

我有一篇文章对此https://medium.com/@truongsinh/flutter-dart-async-concurrency-demystify-1cc739aaae57

进行了说明 简而言之,即使Dart代码是在单个线程中执行的,Flutter / Dart在技术上也不是单线程的。 Dart是具有消息传递模式的并发语言,可以充分利用现代多核体系结构,而不必担心锁定或互斥。 Dart中的阻止可以是I / O约束,也可以是CPU约束,分别应通过Future和Dart的Isolate / Flutter的计算来解决。