繁体   English   中英

Twitter 期货 - 如何处理未使用的期货?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM