在文档中,Dart是单线程的,但是为了一次执行两项操作,我们使用了与线程相同的将来对象。
使用Future对象(期货)执行异步操作。
如果Dart是单线程的,那么为什么它允许执行异步操作。 **注意:**异步操作是并行操作,称为线程
答案 0 :(得分:4)
为什么?因为这是必须的。某些操作(例如http请求或计时器)本质上是异步的。
有些隔离允许您在不同的进程中执行代码。与其他编程语言中的线程的区别在于,隔离体不会彼此共享内存(这会导致并发问题),它们仅通过消息进行通信。
Dart使用事件循环来接收这些消息(或包装在Future
中,作为结果)。
答案 1 :(得分:1)
您提到了:
异步操作是称为线程的并行操作
首先,异步操作不是完全并行,甚至不是并发。它仅表示我们不想阻塞执行流(线程)或等待响应完成某些工作。但是我们实现异步操作的方式可以决定它是并行的还是并发的。
并行性与并发性?
平行主义实际上是在 同时。前-您正在散步,同时正在消化 你吃两项任务完全并行运行,并且恰好在 同时。
而
并发是并行的错觉,任务似乎已执行 平行,但事实并非如此。就像一次要处理很多事情,但 在特定时间只能完成一项任务。前-您正在行走,突然停下来系紧您的表演蕾丝。系好鞋带后,您又可以开始行走了。
现在进入Dart,Future
对象与async
和await
关键字一起用于执行异步任务。这里异步并不意味着任务将彼此并行或并发执行。相反,在Dart中,甚至异步任务都在同一线程上执行,这意味着在我们等待另一个任务完成时,我们将继续执行同步代码。 Future
对象用于表示将来在某个时候完成的任务的结果。
如果您想真正地同时执行任务,请考虑使用Isolates(在单独的线程中运行,并且不与主线程(或生成线程)共享内存。
答案 2 :(得分:1)
以下是一些注意事项:
有关更多资源的链接,请参见this answer。
答案 3 :(得分:0)
Dart 是单线程的,但是它可以调用本地代码(如 c/c++)来执行异步操作,这会引入新的线程。
在 Flutter 中,Flutter 引擎是用 C++ 实现的,它提供 Flutter 核心 API 的底层实现,包括通过底层新线程的文件和网络 I/O 等异步任务。
和 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的计算来解决。