我试图理解语句背后的理性 对于绝对需要阻止的情况,可以阻止期货(尽管不鼓励)
背后的想法ForkJoinPool
是加入阻塞操作的进程,这是期货和参与者的执行者上下文的主要实现。它应该对阻止连接有效。
我写了一个小基准,在这个非常简单的场景中,旧式期货(scala 2.9)似乎快了 2 倍。
@inline
def futureResult[T](future: Future[T]) = Await.result(future, Duration.Inf)
@inline
def futureOld[T](body: => T)(implicit ctx:ExecutionContext): () => T = {
val f = future(body)
() => futureResult(f)
}
def main(args: Array[String]) {
@volatile
var res = 0d
CommonUtil.timer("res1") {
(0 until 100000).foreach { i =>
val f1 = futureOld(math.exp(1))
val f2 = futureOld(math.exp(2))
val f3 = futureOld(math.exp(3))
res = res + f1() + f2() + f3()
}
}
println("res1 = "+res)
res = 0
res = 0
CommonUtil.timer("res1") {
(0 until 100000).foreach { i =>
val f1 = future(math.exp(1))
val f2 = future(math.exp(2))
val f3 = future(math.exp(3))
val f4 = for(r1 <- f1; r2 <- f2 ; r3 <- f3) yield r1+r2+r3
res = res + futureResult(f4)
}
}
println("res2 = "+res)
}
start:res1
res1 - 1.683 seconds
res1 = 3019287.4850644027
start:res1
res1 - 3.179 seconds
res2 = 3019287.485058338