我需要调用可能会或不会及时返回结果的服务。我希望能够写作
val result = runWithTimeout(5000, valReturnedOnTimeout) { service.fetch }
是否有一个标准函数可以完成这项工作 - 比如 Ruby 的 timeout ?
最佳答案
归功于其他答案 - 在没有任何标准库函数的情况下,我走上了 Futures 路线。
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._
def runWithTimeout[T](timeoutMs: Long)(f: => T) : Option[T] = {
Some(Await.result(Future(f), timeoutMs milliseconds))
}
def runWithTimeout[T](timeoutMs: Long, default: T)(f: => T) : T = {
runWithTimeout(timeoutMs)(f).getOrElse(default)
}
以便
@Test def test {
runWithTimeout(50) { "result" } should equal (Some("result"))
runWithTimeout(50) { Thread.sleep(100); "result" } should equal (None)
runWithTimeout(50, "no result") { "result" } should equal ("result")
runWithTimeout(50, "no result") { Thread.sleep(100); "result" } should equal("no result")
}
对于这是否是一种好的 Scala 风格的任何反馈,我将不胜感激!
关于scala - 是否有标准的 Scala 函数来运行一个超时的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6227759/