Is there a standard Scala function for running a block with a timeout?

后端 未结 6 471
伪装坚强ぢ
伪装坚强ぢ 2020-12-19 02:40

I need to call into a service that may or not return timely results. I\'d like to be able to write

val result = runWithTimeout(5000, valReturnedOnTimeout) {         


        
6条回答
  •  误落风尘
    2020-12-19 03:23

    With credit to the other answers - in the absence of any standard library function, I've gone down the Futures route.

      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)
      }
    

    So that

      @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")
      }
    

    I'd be grateful for any feedback as to whether this is a good Scala style!

提交回复
热议问题