如何等待多个期货?

2024-03-17

假设我有几个 future 并且需要等到either其中任何一个都失败了or他们都成功了。

例如: 假设有 3 个期货:f1, f2, f3.

  • If f1成功并且f2失败我不等待f3(并返回failure给客户)。

  • If f2失败同时f1 and f3仍在运行我不等他们(并返回failure)

  • If f1成功然后f2成功我继续等待f3.

你会如何实施它?


您可以使用 for 理解,如下所示:

val fut1 = Future{...}
val fut2 = Future{...}
val fut3 = Future{...}

val aggFut = for{
  f1Result <- fut1
  f2Result <- fut2
  f3Result <- fut3
} yield (f1Result, f2Result, f3Result)

在此示例中,期货 1、2 和 3 并行启动。然后,在 for 理解中,我们等待结果 1、然后 2、然后 3 可用。如果 1 或 2 失败,我们将不再等待 3。如果 3 项都成功,那么aggFutval 将保存一个具有 3 个槽的元组,对应于 3 个 future 的结果。

现在,如果您需要在 fut2 首先失败时停止等待的行为,事情会变得有点棘手。在上面的示例中,您必须等待 fut1 完成才能意识到 fut2 失败。为了解决这个问题,你可以尝试这样的事情:

  val fut1 = Future{Thread.sleep(3000);1}
  val fut2 = Promise.failed(new RuntimeException("boo")).future
  val fut3 = Future{Thread.sleep(1000);3}

  def processFutures(futures:Map[Int,Future[Int]], values:List[Any], prom:Promise[List[Any]]):Future[List[Any]] = {
    val fut = if (futures.size == 1) futures.head._2
    else Future.firstCompletedOf(futures.values)

    fut onComplete{
      case Success(value) if (futures.size == 1)=> 
        prom.success(value :: values)

      case Success(value) =>
        processFutures(futures - value, value :: values, prom)

      case Failure(ex) => prom.failure(ex)
    }
    prom.future
  }

  val aggFut = processFutures(Map(1 -> fut1, 2 -> fut2, 3 -> fut3), List(), Promise[List[Any]]())
  aggFut onComplete{
    case value => println(value)
  }

现在这可以正常工作,但问题在于知道哪个Future从中删除Map当其中一项已成功完成时。只要您有某种方法可以将结果与产生该结果的未来正确关联起来,那么这样的事情就可以了。它只是递归地不断从 Map 中删除已完成的 Futures,然后调用Future.firstCompletedOf关于剩余的Futures直到没有人留下为止,沿途收集结果。这并不漂亮,但如果你真的需要你正在谈论的行为,那么这个或类似的东西可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何等待多个期货? 的相关文章

随机推荐

  • 在 PowerPoint 中重命名对象

    可能是一个非常愚蠢的问题 但我不知道如何在 PowerPoint 中重命名对象 例如 我所有的图表默认称为 图表 1 等 有人可以帮我吗 谢谢 在 PowerPoint 2007 中 您可以从 选择 窗格执行此操作 要显示选择窗格 请单击功
  • 尽管在本地主机上工作,但部署到 Azure 时,Azure Active Directory 始终重定向到“~/.auth/login/done”

    因此 我正在开发一个 ASP NET Core 应用程序 NET Core 2 0 作为 Azure 上的应用服务托管 我想使用单个租户 因此只有我们公司的帐户 通过 Azure AD 实施身份验证 实际上 我添加了所有必要的代码 注册了应
  • 在 Outlook 中执行搜索查询

    您好 我想知道是否可以从我的 WinForms 应用程序向 Outlook 2010 发送搜索查询 也就是说 不是像我一直在搜索并找到的那样搜索 PST 文件 而是尝试在 Outlook 中显示结果列表 就像我自己在搜索框中键入内容一样 如
  • ELM QueryString 解析器无法编译

    我真的很想学习一些 ELM 但是我的思想在查询解析时崩溃了 我的想法是创建一个函数来按名称获取查询字符串值 例如 给定一个查询字符串 name Neuber像这样的函数getParam name 那会返回Neuber 但它在最基本的例子中失
  • wxpython滚动面板不更新滚动条

    我正在使用 winxp 和 wxpython wxpython 3 1 python 2 6 制作一个 GUI 程序 它将文本从 TextCtrl 复制到包含 StaticText 的 ScrollablePanel 中 这一切都工作正常
  • 在内容安全策略中将多个域列入白名单

    我正在编写一个 chrome 扩展 它的白名单中需要有两个域以用于内容安全策略 我已经查看了官方文档 但似乎仍然无法弄清楚正确的语法 以下似乎不起作用 content security policy script src self http
  • AWS NodeJS SDK V3 DynamoDB UpdateItem - TypeError:无法读取未定义的属性“0”

    我正在尝试使用新的适用于 NodeJS 的 AWS SDK V3 在 NodeJS 中进行基本的数据库更新操作 我尝试更新的数据对象如下所示 auth BOOL false username S siegbert secondsLeft N
  • 如何查看和复制 R 默认 Makevars 配置?

    我没有 R Makevars文件和 gt tools makevars user character 0 gt tools makevars site character 0 Yet R必须从某处读取配置 cpp文件包含Rcpp导出到包中s
  • 计算公式的子公式

    选择有公式的单元格后 我们可以在Excel公式栏中选择其公式的一部分并进行计算 按F9 我需要通过 JavaScript API 重现子公式的计算 例如 假设 Cell 的值A1 B1 C1分别是1 2 3 和细胞D1包含一个公式 A1 B
  • 将 2d int 数组转换为 2d double 的最短方法

    我有一个方法只能得到double 我想传递给int 在java中有没有一种简单的方法可以做到这一点 就像这样简单 int iArray 1 2 5 6 double dArray double iArray 不幸的是 转换数组的唯一方法是迭
  • 使声明的名称空间正常工作时遇到问题

    我试图获取用外部 css 编写的命名空间 实际上是两个单独的文件 当我在浏览器上运行该文件时 它不会使用声明的名称空间 我认为该文件正在调用 css 文件 但它没有应用命名空间样式 HTML
  • Fortran 接受来自 C 的字符串(?)

    我觉得这应该是一个简单的问题 但我无法让它发挥作用 我有一些 Fortran 代码 需要如下输入 SUBROUTINE TRACE X Y NAME XX YY EXTERNAL NAME CALL NAME X Y XX YY 我正在尝试
  • ILookup 不应该在 TElement 中(声明)协变吗?

    定义System Linq ILookUp
  • 在两个不同的系统之间同步对象,最好的方法是什么?

    我正在致力于使用基于 XML 的有效负载在 iPhone 和网站之间同步两个业务对象 并且很乐意征求一些关于最佳例程的想法 这个问题的本质是相当通用的 我可以看到它适用于需要在 Web 实体和客户端 桌面 移动电话等 之间同步业务对象的各种
  • 我什么时候会在 ASP.NET 中使用委托?

    我一直在寻找一种方法来使用我能使用的所有工具 并超越我目前的水平 但是 尽管我读过有关委托的内容 但我永远找不到使用它们的地方 例如接口 泛型和很多东西 但我离题了 我希望有人可以向我展示他们何时以及如何使用委托在webasp net c
  • 与 Paramiko 的无密码 SSH 连接失败,而 SSH 可以正常连接

    我打算在客户端和服务器之间使用 SSH 密钥创建无密码连接 使用 paramiko 我最终得到了认证异常 通过 Popen 使用标准 SSH 我可以毫无问题地连接 对于 Paramiko 我使用以下代码 client paramiko SS
  • jQuery 中的简单淡入和可见性

    我正在尝试更改 css 属性visibility一个 div 到visible用 jQuery fadeIn 过渡 这是我的代码 a click function test fadeIn slow function this css vis
  • 伪终端中的 Ncurses 程序

    在我不断尝试了解伪终端如何工作的过程中 我编写了一个小程序来尝试运行 bash 问题是 我的断线似乎已经关闭 shell 提示符仅在我按 Enter 键后出现 此外 我仍然无法正确使用 ncurses 程序 例如 vi 谁能告诉我如何为此设
  • Swift - 在 NSArray 中插入对象/项目/添加对象/项目

    我有这个代码 var NToDel NSArray var addInNToDelArray Test1 Test2 如何添加addInNToDelArray in NToDel NSArray 你不能 NSArray是一个不可变数组 因此
  • 如何等待多个期货?

    假设我有几个 future 并且需要等到either其中任何一个都失败了or他们都成功了 例如 假设有 3 个期货 f1 f2 f3 If f1成功并且f2失败我不等待f3 并返回failure给客户 If f2失败同时f1 and f3仍