未来需要很长时间才能运行,为什么不马上回来?

时间:2014-04-23 12:21:40

标签: scala future

我有以下代码,我希望a.success(burncpu(14969))能够立即返回,因为它将来会运行,但为什么需要很长时间才能运行。

import scala.concurrent._
val a=Promise[Unit]()
// why the following took long time here, shouldn't it be in async mode, and return very quick
a.success(burncpu(14969))  
a.future


def burncpu(a:Int):Int = {
  val point=new Date().getTime()
  while ((new Date()).getTime()-point< a) {
    a
  }
  a
}        

3 个答案:

答案 0 :(得分:3)

Promise.success不是异步执行的,基本上你的代码相当于:

Future.successful(burncpu(14969))

你可以试试这个:

Future {
  burncpu(14969)
}

这将调用Future.apply并异步执行您的函数。

答案 1 :(得分:3)

您使用的是Promise错误。

a.success方法使用给定参数完成promise,它不会运行您异步传递给它的表达式。

你可能想要做的是这样的事情:

val f = Future(burncpu(6000))

假设您有ExecutionContext可用(如果不这样做,则可以执行import ExecutionContext.Implicits.global),这将构造一个Future,它将异步运行您的函数。

您可以在Scala REPL中看到它的工作原理(f.value返回None,直到方法返回)

scala> val f = Future(burncpu(6000))
f: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@4d4d8fcf

scala> f.value
res27: Option[scala.util.Try[Int]] = None

scala> f.value
res28: Option[scala.util.Try[Int]] = None

scala> f.value
res29: Option[scala.util.Try[Int]] = Some(Success(6000))

答案 2 :(得分:0)

future的调用确实是异步调用的。 但是,API中没有任何内容表明在您的情况下完成Promise,即调用success将异步执行。这是您的责任,确保。

当您考虑 Promise是什么时,这是有意义的 - &#34;标记&#34;到另一个执行路径,通知它已完成计算并且结果(或失败)可用。