当在Scala中花费太多时间时,如何终止该函数?

xyz*_*xyz 1 scala

最近,我正在学习Scala语言。今天,我提出一个问题,即花太多时间如何终止函数。

例如:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, World")
    // How to terminate the sum() function
    // when the time that it takes greater than 2 second?
    val t0 = System.nanoTime : Double
    val total: BigInt = sum(1000000000)
    val t1 = System.nanoTime : Double
    println("Elapsed time " + (t1 - t0) / 1000000.0 + " msecs")

    println(total)

  }

  //Given that sum() is written by others and I cannot change it.
  def sum(k: Int): BigInt = {
    var total: BigInt = 0
    for (i <- 1 to k) {
      total += i
    }
    total
  }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

上面的scala代码大约需要70s。

C4s*_*tor 5

使用未来!

val resultFuture : Future[ReturnType] = Future.apply {
 longComputation
}

val resultMaybeCut = Await.result(resultFuture, DurationOfChoice)
Run Code Online (Sandbox Code Playgroud)

作为记录,Await.result(awaitable:Awaitable [T],atMost:Duration):

  • 如果当前线程在等待时被中断,则抛出InterruptedException
  • 如果在等待指定时间后awaitable仍未准备就绪,则抛出TimeoutException
  • 如果atMost为Duration.Undefined,则抛出IllegalArgumentException

警告(感谢@markusthoemmes):

这样做不会中断基础的未来计算,而只是让您轻松地对其超时!(这可能是问题,也可能不是问题)。如果我相信在Scala 2.10中杀死或使Future超时,则没有超级简单的方法来真正停止基础计算,因此您可能要参考此处发布的其他解决方案!