"Speculative execution" 的 Scala 期货

"Speculative execution" of Scala Futures

我想做一些事情,比如创建两个 Futures,在一个代码路径中使用第一个 returns 并将 "slow" Future 发送到不同的代码路径。

一个用例是,例如我可以选择调用两个外部端点之一,即 "variable speed" 和 "old reliable"。来自任何一个的数据都很好,所以我宁愿调用两者并使用 "whichever comes first" 和(也许也对另一个输出做一些事情)。

我总是可以检查期货是否准备好了,但是有没有比例如只是循环调用 Await.ready ? (人们怎么称呼这种模式?)

您可以创建 Promise 并从您的 Futures 完成它。

import scala.concurrent.{Future, Promise}
import scala.util.Random
import scala.concurrent.ExecutionContext.Implicits.global

val p = Promise[String]

Future {
  Thread.sleep(Random.nextInt(10000))
  "1"
}.onComplete(p.complete)

Future {
  Thread.sleep(Random.nextInt(10000))
  "2"
}.onComplete(p.complete)


p.future.foreach {res =>
  println(res)
}

这只是:

Future.firstCompletedOf(List(f1, f2)).map(first => ...) 
//or `foreach`/`Await` if you can't interact with Future-ready IO

这是scaladocs