当前位置: 首页 > 知识库问答 >
问题:

Scala中序列中的多个期货

晋坚
2023-03-14

我有两个在未来发生的计算,如下所示:

val comp1 = Future { ... }
val comp2 = Future { ... }

我希望它能够运行,以便comp2总是在comp1完成后运行!我知道使用一个表达,我可以组成这两个Future的喜欢。

for {
  comp1Result <- comp1
  comp2Result <- comp2
} yield { ... }

什么能保证comp1在comp2之前完成?我的意思是这些是发生在不同线程中的计算,并且不能保证运行的顺序。有没有一种方法可以保证没有阻塞的顺序?

共有1个答案

卢黎明
2023-03-14

用于理解的 Scala 是用于“容器类型”(在本例中为 Futures)的 flatMap 和 map 调用组合的语法糖,因此您上面的代码等于:

comp1.flatMap{ comp1Result => comp2 }

此处大括号内的计算仅在 comp1 完成并返回成功结果后发生(在失败的情况下,内部计算不会执行)。

如果您在问题中所示的for理解之外定义comp2,那么您将启动该计算(您只需忽略结果,直到您进入for理解),但如果您仅在for理解中定义它,那么它不会被启动,除非并且直到comp1成功完成。所以,尝试如下重新调整代码:

val comp1 = Future { ... } // or you could put this construction inside the for as well
for {
  comp1Result <- comp1
  comp2Result <- Future { ... } // Only start the computation here
  comp3Result <- Future { ... } // etc. for as many such computations as you need
} yield { ... }

其他替代方法是将comp2声明为一个惰性val(因此它实际上并不被求值——开始计算——直到它被引用),或者声明为一个lambda(例如< code>val comp2 = () =

  comp2Result <- comp2()

里面的理解。

 类似资料:
  • 我想创建一个函数来返回成功操作的一系列期货的结果。我遇到的问题是返回类型为Unit,并且未来函数正在完成,而无需等待嵌套的未来序列完成。我尝试过不使用on完成函数,而是使用map或平面图,但没有成功。我还想避免使用wait 这个后来会这么叫

  • 我正在使用: Scala 2.10 游戏2.1 目前,我正在使用 类,但我愿意尝试另一个 API。 我很难将多个期货的结果组合成一个列表[(String, String)]。 以下 方法成功地将单个 Future 的结果返回到 HTML 模板: 方法执行 Web 服务 API 调用并返回 Future[play.api.libs.ws.Response]。方法 向 HTML 模板返回 List[(

  • 我想把这个val: 对它进行一些操作(我正在考虑展平) 然后得到这个结果 如果展平方法在这里不合适,那很好。只要我得到结果。 谢啦!

  • 我想创建一个未来列表,每个未来都可能通过或失败,并整理成功未来的结果。我该怎么做? 问题1)我想等待每个未来完成2)我想从每个成功的未来收集返回值的总和,并忽略失败的回报值(所以我应该得到3)。

  • 注意:我不想使用任何库。试图解决https://icpc.kattis.com/problems/stacking 在以下条件下,合并排序数组所需的最小操作数是多少: 拆分:可以将单个堆栈拆分为两个堆栈,方法是将堆栈的任何顶部提起并放在一边,形成一个新堆栈。 连接:两个堆栈可以通过将一个放在另一个上面来连接。仅当顶部堆叠的底板不大于底部堆叠的顶板时,才允许这样做,也就是说,必须正确订购连接的堆叠。

  • 我必须从带有Scala的RESTAPI中获取给定列表中每个文件的问题列表。我想并行处理这些请求,并使用调度库来实现。我的方法是从Java框架调用的,我必须在该方法结束时等待所有未来的结果,以将整体结果返回到框架。这是我的密码: 这段代码有几个问题。首先,我没有得到我期望的< code>issuesByFile (1)的类型。如果< code>findLookUpId无法找到查找Id(即< code