我需要等待许多Future来完成它们的计算,一堆HTTP请求,我不希望所有这些都按顺序进行await,因为这将导致对每个Future进行顺序的评估,一个接一个,有点同步性,这是浪费的,因为有些Future可能会比其他Future更早地完成。
我在Future.wait的文档中找不到真正的异步的,它同时触发所有的Future,或者如果它是一个接一个地调用它们,等待前一个完成调用下一个。
在nushell中:我正在寻找最佳的性能方法,以便在Dart中获得许多HTTP请求的结果。
发布于 2020-02-18 22:21:49
Future.wait确实以异步的方式等待多个期货,因为每个期货都是独立地启动的。相反,Future.forEach会循环浏览期货列表,并按顺序等待。
例如,如果您有以下期货列表:
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将产生以下输出:
3 (after 1 second)
2 (after 2 seconds)
1 (after 3 seconds)而在列表中调用Future.forEach会导致以下结果:
1 (after 3 seconds)
2 (after 5 seconds)
3 (after 6 seconds)这是因为wait同时激发它们,然后按照它们的解析来处理它们,而forEach则按顺序单独地激发它们,并在进入下一个解析之前等待每个解析。
(这里有一个通常的免责声明,即异步编程与并行编程并不是一回事,Dart本身就是一种单线程语言,因此真正的并行性不能仅靠未来实现。)
发布于 2020-02-18 21:53:29
如果您在以下文件中检查Future.wait方法的实现:
您实际上可以看到它通过输入列表中的每个Future并运行then方法,该方法是在Future完成时要运行的方法:
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方法是有意义的。
https://stackoverflow.com/questions/60289103
复制相似问题