【问题标题】:How does Dart/Flutter execute code concurrently even if it's single threaded?即使它是单线程的,Dart/Flutter 如何同时执行代码?
【发布时间】:2021-07-18 06:13:15
【问题描述】:

我是 Dart/Flutter 的新手,并且有一些 Node.js 背景,我知道 Dart 与 Node.js 有一些相似之处,比如事件循环和单线程。但是我很难理解 Dart 是如何处理 async 来阻塞 I/O 操作的,尤其是像文件系统和数据库操作这样的内部 I/O。

对于 Node.js,当它处理阻塞 I/O 时,假设是读取文件的内容。它将文件系统操作放在Thread Pool 中,Node.js 然后在主线程中并发(非并行)运行下一行代码,同时文件系统操作继续运行。当它完成读取文件时,它会在Event Queue 中放置一个读取文件回调事件,该事件将由Event Loop 出列并在主线程中执行。 Node.js 的概念不难理解,但 Dart 呢?

由于 Dart 没有 Thread Pool 或类似 Node.js 的东西,它是单线程的,官方网站说它在主线程中运行所有东西,无论是找到 Futureasync 还是类似的东西,它仍然在主线程中运行,当它完成该操作时,它会将回调放入Event Queue 等待被Event Loop 出列并在主线程中执行。

这让我感到困惑,Dart 仍然可以在文件系统操作(阻塞 I/O)仍在运行时运行下一行代码。请看这段代码

File myFile = File("some-text-file");
myFile.readAsString().then((content) {
  print(content);
});
print("This is my next line");

输出:

This is my next line
Lorem ipsum...

如果不使用 Thread Pool 或类似于 Node.js 的东西不阻塞 I/O 操作,这怎么可能?如果是 Node.js,myFile.readAsString() 将委托给Thread Pool 进行并发。

或者 Dart 确实在底层只是为阻塞 I/O 操作生成了一个新的Isolate

提前感谢您的所有回答。

【问题讨论】:

    标签: multithreading flutter dart


    【解决方案1】:
    1. Concurrency is not the same as parallelism。您不需要多个线程并发。

    2. 每个 Dart isolate 都是单线程的,但一个 Dart 程序可以有多个隔离。

    3. Dart 运行时/VM(以及其他在 Dart 之外实现的东西)可以产生 OS 线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2019-04-21
      • 1970-01-01
      • 2019-03-31
      • 2017-09-14
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多