我有以下代码,我希望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
}
答案 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;到另一个执行路径,通知它已完成计算并且结果(或失败)可用。