"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。
我想做一些事情,比如创建两个 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。