2

我正在学习 Dart 的未来,并阅读了一些关于Future.

它说 Dart 是单线程的,我们可以用它Future来让一些昂贵的函数稍后运行,例如读取文件。

假设读取一个文件需要 10 秒,而我有 3 个文件要读取。

我的飞镖代码:

main() {
  readFile("aaa.txt");
  readFile("bbb.txt");
  readFile("ccc.txt");
  print("Will print the content of the files later");
}

readFile(String filename) {
  File file = new File(filename);
  file.readAsString().then((content) {
    print("File content:\n");
    print(content);
  });
}

由于读取文件需要 10 秒,所以上面的代码至少需要 30 秒,对吧?使用future读取文件只是为了让昂贵的任务在以后一个接一个地运行,不会阻塞当前代码,但不会降低总成本?

如果在 java 中,我可以创建一个线程池,并让 3 个未来的任务并行运行,总成本将在 10 到 20 秒之间。

是否可以在 Dart 中做同样的事情?使用 Dart 的隔离是唯一的解决方案吗?

4

2 回答 2

3

我预计这可能需要 10 秒,因为它将开始三个读取,每个读取完成后都会将回调排队到“then”函数。这三个文件完全有可能并行加载并在 10 秒后全部完成。回调将在主线程上按顺序调用。

虽然 dart 中的用户代码是单线程的(假设你不使用隔离或 web 工作者),但没有什么说实现不能创建线程或使用操作系统的异步加载来并行执行任务,只要未来的运行依次在主线程中。

于 2014-02-03T13:10:42.777 回答
2

这是正确的。如果你用 , 开始一个新的异步路径new Timer()new Future()或者scheduleMicrotask()它将被安排在以后执行。

当您的一个异步路径正在等待网络请求或文件系统返回数据时,另一个异步路径可能会同时跳入并运行。因此,您可能会获得少于 30 秒的运行时间,但您无法通过添加 CPU 来减少运行时间。我不得不承认,我不知道有关计划何时发生以及它是如何工作的详细信息。

Dart 没有线程,所以如果你想并行运行代码,你需要隔离。

于 2014-02-02T16:41:54.747 回答