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

M.A*_*han 16 multithreading dart flutter

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

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

如果 Dart 是单线程的,那么为什么它允许执行异步操作。

注意:异步操作是并行操作,称为线程

Shu*_*oni 11

你提到:

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

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

并行与并发?

并行实际上是同时做很多事情。ex - 你在走路,同时你在消化你的食物。这两个任务完全并行且完全同时运行。

尽管

并发是并行的错觉。任务似乎是并行执行的,但实际上并非如此。它喜欢一次处理很多事情,但在特定时间只做一项任务。ex - 你正在走路,突然停下来系你的秀花边。系好鞋带后,你又开始走路了。

现在来到 Dart,Future对象async和await关键字用于执行异步任务。这里异步并不意味着任务将彼此并行或并发执行。相反,在 Dart 中,即使异步任务也在同一个线程上执行,这意味着当我们等待另一个任务完成时,我们将继续执行我们的同步代码。Future对象用于表示将在未来某个时间完成的任务的结果。

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

  • 我认为这个问题中对并发的解释是不正确的 - 并发线程可能会也可能不会并行运行。一个程序可以在多个线程中同时运行代码,如果这些线程在多个 CPU 核心上执行,则也可以并行运行。我觉得这提供了一个很好的解释/sf/answers/2562316571/ (2认同)

聂超群*_*聂超群 7

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

\n

在 Flutter 中,Flutter 引擎是用 C++ 实现的,它提供了 Flutter\xe2\x80\x99s 核心 API 的底层实现,包括通过底层的新线程来实现文件和网络 I/O 等异步任务。\n在此输入图像描述

\n

和 Dart 一样,JavaScript 也是单线程的,我发现这个视频对于理解“单线程”非常有帮助。事件循环到底是什么

\n


bof*_*mer 6

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

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

为了接收这些消息(或包裹在 a 中Future,它的结果),Dart 使用了一个事件循环。