[英]Twitter Futures - how are unused futures handled?
所以我在 Scala 中有一个 api 使用 twitter.util.Future
就我而言,我想创建 2 个期货,其中一个取决于另一个的结果并返回第一个期货
def apiFunc(): Future[Response]={
val future1 = getFuture1()
val future2 = future1 map {
resp => processFuture1Resp(resp)
}
future1
}
所以在这种情况下,future2 永远不会被消耗,并且 api 在future2 完成之前返回future1 的结果
我的问题是 - 即使 api 已经返回,future2 会运行吗?
我的理解是期货会产生线程,但我不确定该线程是否会在主线程返回后终止
我想问这个问题的另一种方式是 - twitter.util.future 总是会被执行吗?
如果你想链接两个future,其中一个处理另一个future的结果(并返回一个future),你可以使用for理解:
def getFuture1() = {
println("Getting future 1...")
Thread.sleep(1000)
Future.successful("42")
}
def processFuture1Resp(resp: String) = {
println(s"Result of future 1 is: ${resp}")
"END"
}
def apiFunc(): Future[String]={
for {
res1 <- getFuture1()
res2 <- Future(processFuture1Resp(res1))
} yield res2
}
def main(args: Array[String]) {
val finalResultOfFutures: Future[String] = apiFunc()
finalResultOfFutures
Thread.sleep(500)
}
这将打印:
Getting future 1...
Result of future 1 is: 42
值finalResultOfFutures
将包含链接两个期货的结果,并且您将确保第一个期货在第二个期货之前执行。 如果不等待主线程执行finalResultOfFutures
(注释主线程的最后一个sleep function),只会看到:
Getting future 1...
主线程将在第二个未来有时间打印任何东西之前完成。
等待未来执行的另一种(更好)方法是这样的:
val maxWaitTime: FiniteDuration = Duration(5, TimeUnit.SECONDS)
Await.result(finalResultOfFutures, maxWaitTime)
Await.result
将阻塞主线程并等待给定 Future 的结果定义的持续时间。 如果它没有准备好或完成失败,Await.result 将抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.