摇动多个异步方法以并行执行

时间:2019-04-03 19:03:59

标签: asynchronous flutter async-await

我仍在为异步/等待模式而苦苦挣扎,所以我在这里问你一些精度。

我看到this page很好地解释了异步/等待模式。我在这里发布困扰我的示例:

import 'dart:async';

Future<String> firstAsync() async {
  await Future<String>.delayed(const Duration(seconds: 2));
  return "First!";
}

Future<String> secondAsync() async {
  await Future<String>.delayed(const Duration(seconds: 2));
  return "Second!";
}

Future<String> thirdAsync() async {
  await Future<String>.delayed(const Duration(seconds: 2));
  return "Third!";
}

void main() async {
  var f = await firstAsync();
  print(f);
  var s = await secondAsync();
  print(s);
  var t = await thirdAsync();
  print(t);
  print('done');
}

在此示例中,每个async方法都一个接一个地调用,因此main函数的执行时间为6秒(3 x 2秒)。但是,我不理解如果异步函数一个接一个地执行又有什么意义。

是否async个函数不应该在后台执行?多个async函数通过并行执行来加快进程的速度不是很重要吗?

我认为我缺少关于异步函数和异步/等待模式的信息,因此,如果您能向我解释一下,将不胜感激。

最佳

8 个答案:

答案 0 :(得分:1)

该示例旨在说明如何在不实际阻塞线程的情况下等待长时间运行的进程。实际上,如果您有多个要并行运行的对象(例如,独立的网络调用),则可以进行优化。

调用await会停止方法的执行,直到将来完成为止,因此对secondAsync的调用要等到firstAsync完成之后再进行,依此类推。如果您改为这样做:

void main() async {
  var f = firstAsync();
  var s = secondAsync();
  var t = thirdAsync();
  print(await f);
  print(await s);
  print(await t);
  print('done');
}

然后立即开始所有三个期货,然后等待它们以特定顺序结束。

值得强调的是,现在fst的类型为Future<String>。您可以为每个未来尝试不同的持续时间,或更改语句的顺序。

答案 1 :(得分:1)

你总是可以在一个未来使用它们

final results = await Future.wait([
  firstAsync();
  secondAsync();
  thirdAsync();
]);

results 将是您返回类型的数组。在本例中为字符串数组。

干杯。

答案 2 :(得分:1)

如果有人对此问题不熟悉,请使用 async 。 Dart 有一个名为 FutureGroup 的函数。您可以使用它来并行运行期货。

示例:

final futureGroup = FutureGroup();//instantiate it

void runAllFutures() {
  /// add all the futures , this is not the best way u can create an extension method to add all at the same time
  futureGroup.add(hello());
  futureGroup.add(checkLocalAuth());
  futureGroup.add(hello1());
  futureGroup.add(hello2());
  futureGroup.add(hello3());
  
  // call the `.close` of the group to fire all the futures,
  // once u call `.close` this group cant be used again
  futureGroup.close();

  // await for future group to finish (all futures inside it to finish)
  await futureGroup.future;
}

这个 futureGroup 有一些有用的方法可以帮助你即。 .future 等。请查看 documentation 以获取更多信息。

以下是使用 await/async 的示例用法 Example One 和使用 Future.thenExample Two

答案 3 :(得分:1)

试试这个解决办法。

final List<Future<dynamic>> featureList = <Future<dynamic>>[];
for (final Partner partner in partnerList) {
  featureList.add(repository.fetchAvatar(partner.uid));
}
await Future.wait<dynamic>(featureList);

答案 4 :(得分:0)

在执行下一个任务之前需要资源时,使用async / await这样很有用。

在您的示例中,您并没有做真正有用的事情,但是假设您调用firstAsync,这会在您的手机中提供一个已存储的授权令牌,然后您调用secondAsync,使该令牌异步获取,执行HTTP请求,然后检查此请求的结果。
在这种情况下,您不会阻塞UI线程(用户可以与您的应用进行交互),而其他任务(获取令牌,HTTP请求...)则在后台完成。

答案 5 :(得分:0)

我想您想念您首先理解颤振的工作原理颤振不是多线程的.....! 第二,如果它不是多线程的,它将如何执行并行任务,这不会发生……。这是一些链接,可帮助您了解更多https://webdev.dartlang.org/articles/performance/event-loop https://www.dartlang.org/tutorials/language/futures

flutter不会将期货放在另一个线程上,但是将它们添加到队列中会发生什么情况,我添加的链接用于事件循环以及期货如何工作。希望你明白了,随时问我:)

答案 6 :(得分:0)

如果要并行执行,则应切换到称为隔离的多线程概念。 将此与 async / await 概念混合使用。您还可以访问此网站了解更多信息

https://buildflutter.com/flutter-threading-isolates-future-async-and-await/

答案 7 :(得分:0)

等待使用Future.wait()完成多个Future 如果功能的执行顺序不重要,则可以使用Future.wait()。

功能被快速连续触发;当它们全部用一个值完成时,Future.wait()返回一个新的Future。此Future包含一个列表,其中包含每个函数产生的值。

Future
    .wait([firstAsync(), secondAsync(), thirdAsyncC()])
    .then((List responses) => chooseBestResponse(responses))
    .catchError((e) => handleError(e));

或使用async / await

try {
    List responses = await Future.wait([firstAsync(), secondAsync(), thirdAsyncC()]);
} catch (e) {
    handleError(e)
}

如果任何调用的函数以错误完成,则Future.wait()返回的Future也以错误完成。使用catchError()处理错误。

资源:https://v1-dartlang-org.firebaseapp.com/tutorials/language/futures#waiting-on-multiple-futures-to-complete-using-futurewait