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

Multithreading Dart是单线程的,但为什么它使用将来的对象并执行异步操作,multithreading,dart,flutter,Multithreading,Dart,Flutter,在文档中,Dart是单线程的,但为了一次执行两个操作,我们将使用与线程工作相同的未来对象 使用未来对象(未来)执行异步操作 如果Dart是单线程的,那么为什么它允许执行异步操作呢 注意:异步操作是称为线程的并行操作为什么?因为这是必要的。有些操作,如http请求或计时器,本质上是异步的 存在允许您在不同进程中执行代码的隔离。与其他编程语言中的线程不同的是,隔离之间不共享内存(这将导致并发问题),它们只通过消息进行通信 为了接收这些消息(或包装在未来的,即其结果),Dart使用事件循环 您提

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

使用未来对象(未来)执行异步操作

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


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

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

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

为了接收这些消息(或包装在
未来的
,即其结果),Dart使用事件循环

    • 您提到:

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

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

      并行与并发?

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

      并发性是并行性的幻觉。任务似乎是被执行的 平行,但它们不是。这就像一次处理很多事情,但是 在特定时间只做一项任务。你走着突然停下来系上你的花边。系好鞋带后,你又开始走路了

      现在来看Dart,
      Future
      对象以及
      async
      wait
      关键字用于执行异步任务。这里,异步并不意味着任务将并行或并发执行。相反,在Dart中,甚至异步任务都在同一个线程上执行,这意味着当我们等待另一个任务完成时,我们将继续执行同步代码
      Future
      对象用于表示将来某个时间将要完成的任务的结果


      如果您想同时真正执行您的任务,那么考虑使用隔离(它在单独的线程中运行,并且不与主线程共享内存)(或生成线程)。<强> >/p> < p>我有一篇文章解释这个

      简言之,从技术上讲,颤振/Dart不是单线程的,即使Dart代码是在单线程中执行的。Dart是一种具有消息传递模式的并发语言,它可以充分利用现代多核体系结构,而不必担心锁或互斥。Dart中的阻塞可以是I/O绑定的,也可以是CPU绑定的,这应该是正确的分别通过Future和Dart的隔离/颤振计算解决。

      以下是一些注意事项:

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

      有关更多资源的链接,请参阅。

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

      在颤振中,颤振引擎是在C++中实现的,它提供了颤振的核心API的低层实现,包括通过新线程在文件和网络I/O上的异步任务。


      和Dart一样,JavaScript也是单线程的,我发现这段视频对理解“单线程”非常有帮助事物。

      http请求是否在不同的隔离上执行?我相信这个问题中对并发性的解释是不正确的-并发线程可能并行运行,也可能不并行运行。一个程序可以在多个线程中并发运行代码,如果这些线程在多个CPU上执行,也可以并行运行代码我觉得这是一个很好的解释