Scala中序列中的多个期货

时间:2015-05-30 05:14:34

标签: scala future

我在Future中进行了两次计算,如下所示:

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

我想要这样运行,comp2总是在comp1完成后运行!我知道使用for表达式,我可以将这两个Future组合成。

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

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

1 个答案:

答案 0 :(得分:4)

Scala for comprehension是针对'容器类型'(期货,在本例中为)的flatMap和map调用组合的语法糖,因此上面的代码等同于:

comp1.flatMap{ comp1Result => comp2 }

花括号内的计算只在comp1完成后才会发生,并返回一个成功的结果(如果失败,则内部计算不会被执行)。

如果你在问题之外定义comp2之外的comp2,那么你就开始计算了(你只是忽略了结果,直到你进入for comprehension),但是如果你只在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(例如val comp2 = () => Future { ... })并将其调用线

  comp2Result <- comp2()

在for comprehension中。