Является ли Future.wait полностью асинхронным в Dart? - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно подождать, пока многие Future завершат свои вычисления, набор HTTP-запросов, я не хочу await выполнять все их по порядку, так как это приведет к тому, что каждый Future будет оцениваться по порядку. один за другим, вроде синхронно, что расточительно, так как некоторые Future могут завершиться раньше, чем другие.

Я не могу найти в документах Future.wait действительно асинхронный, запускающий все Future в то же время, или если это то же самое, что вызывать их один за другим, ожидая, пока предыдущий завершит вызов следующего.

В двух словах: я ищу лучший эффективный способ получить результаты многих HTTP-запросов в Dart.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Future.wait ожидает нескольких фьючерсов в асинхронном режиме, так как в каждом из фьючерсов запускается независимо друг от друга. Напротив, Future.forEach проведет oop по списку фьючерсов и будет ожидать их в последовательности.

Например, если у вас был следующий список фьючерсов:

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 по своей сути является однопоточным языком, поэтому истинный параллелизм не может быть достигнут только с помощью будущего.)

1 голос
/ 19 февраля 2020

Если вы проверите реализацию метода Future.wait в:

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

Вы действительно можете видеть, что он проходит через каждый 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.

...