【问题标题】:Why this simple Scala for comprehension does not execute the futures?为什么这个简单的 Scala 理解不执行期货?
【发布时间】:2014-08-08 10:36:18
【问题描述】:

我不知道为什么这不起作用:

import scala.concurrent.future
import scala.concurrent.Future
import scala.concurrent.ExecutionContext

import scala.concurrent.ExecutionContext.Implicits.global

object FutureTest {

  def main(args: Array[String]) {
    val result1 = future("a")
    val result2 = future("b")
    val result3 = future("c")

    val res = for {
      r1 <- result1
      r2 <- result2
      r3 <- result3
    } yield (r1 + r2 + r3)

    for { r <- res} yield(println(r))
  }
}

我希望这会打印“abc”,但实际上什么也没发生。

【问题讨论】:

  • 在我的情况下打印“abc”...
  • 我修复了这个问题,添加了一个 Await.result(res, 3 minutes) 其中 res 是从 for 分配的 val。

标签: scala future for-comprehension


【解决方案1】:

你正在执行一个独立的程序,问题是主线程在未来完成之前就被终止了,看看你可以使用这个:

import scala.concurrent.future
import scala.concurrent.Future
import scala.concurrent.ExecutionContext

import scala.concurrent.ExecutionContext.Implicits.global

object FutureTest {

  def main(args: Array[String]) {
    val result1 = future("a")
    val result2 = future("b")
    val result3 = future("c")

    val res = for {
      r1 <- result1
      r2 <- result2
      r3 <- result3
    } yield (r1 + r2 + r3)

    val printing = for { r <- res} yield(println(r))

    Await.ready(printing, Duration.Inf)
  }
}

【讨论】:

  • 不知何故,我希望程序自动无限期地等待期货终止。显然这不会发生。我在您回答之前找到了一个类似的解决方案(请参阅问题的第二条评论)。但是,是的,我同意这是解决方案。
  • 好吧,如果是这样的话,futures 可能就没用了,因为主线程可能会无限期地阻塞等待未来的结果:D
  • 我同意 Futures 通常应该是异步的,但至少主线程可以在终止之前等待任何未完成的 Futures。我猜!
  • @sscarduzio 这更多是关于 ExecutionContext 而不是 Futures。您可以提供自己的使用非守护线程的 ExecutionContext。
猜你喜欢
  • 2017-03-26
  • 1970-01-01
  • 2011-07-08
  • 2014-10-14
  • 2011-04-07
  • 2016-07-11
  • 2018-08-04
  • 2023-03-24
  • 2015-08-25
相关资源
最近更新 更多