首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Future.wait是否在Dart有笨拙的异步性?

Future.wait是否在Dart有笨拙的异步性?
EN

Stack Overflow用户
提问于 2020-02-18 20:38:36
回答 2查看 302关注 0票数 0

我需要等待许多Future来完成它们的计算,一堆HTTP请求,我不希望所有这些都按顺序进行await,因为这将导致对每个Future进行顺序的评估,一个接一个,有点同步性,这是浪费的,因为有些Future可能会比其他Future更早地完成。

我在Future.wait的文档中找不到真正的异步的,它同时触发所有的Future,或者如果它是一个接一个地调用它们,等待前一个完成调用下一个。

在nushell中:我正在寻找最佳的性能方法,以便在Dart中获得许多HTTP请求的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-18 22:21:49

Future.wait确实以异步的方式等待多个期货,因为每个期货都是独立地启动的。相反,Future.forEach会循环浏览期货列表,并按顺序等待。

例如,如果您有以下期货列表:

代码语言:javascript
复制
var futures = [
  Future.delayed(Duration(seconds, 3)).then((_) => print('1')),
  Future.delayed(Duration(seconds, 2)).then((_) => print('2')),
  Future.delayed(Duration(seconds, 1)).then((_) => print('3')),
];

在此列表上调用Future.wait将产生以下输出:

代码语言:javascript
复制
3 (after 1 second)
2 (after 2 seconds)
1 (after 3 seconds)

而在列表中调用Future.forEach会导致以下结果:

代码语言:javascript
复制
1 (after 3 seconds)
2 (after 5 seconds)
3 (after 6 seconds)

这是因为wait同时激发它们,然后按照它们的解析来处理它们,而forEach则按顺序单独地激发它们,并在进入下一个解析之前等待每个解析。

(这里有一个通常的免责声明,即异步编程与并行编程并不是一回事,Dart本身就是一种单线程语言,因此真正的并行性不能仅靠未来实现。)

票数 3
EN

Stack Overflow用户

发布于 2020-02-18 21:53:29

如果您在以下文件中检查Future.wait方法的实现:

https://github.com/dart-lang/sdk/blob/a75ffc89566a1353fb1a0f0c30eb805cc2e8d34c/sdk/lib/async/future.dart#L354-L443

您实际上可以看到它通过输入列表中的每个Future并运行then方法,该方法是在Future完成时要运行的方法:

代码语言:javascript
复制
      for (var future in futures) {
        int pos = remaining;
        future.then((T value) {
        ...

因此,您可以说所有Future实例都是同时“启动”的,因为每个已完成的Future最终都将检查是否还有更多的未来需要等待。

但是,请注意,Dart是单线程的,场景后面有一个作业队列,所以除非在Isolate实例中完成了一些工作,否则每个作业都将以串行方式运行。有关此问题的更多详细信息可在此处找到:

https://medium.com/dartlang/dart-asynchronous-programming-isolates-and-event-loops-bffc3e296a6a

但是是的,如果你有一堆如果Future是可以按任何顺序处理的,那么使用Future.wait方法是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60289103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档