Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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) { service.fetch }

Is there a standard function that will do the job - like Ruby's timeout?

like image 212
Duncan McGregor Avatar asked Jun 03 '11 13:06

Duncan McGregor


1 Answers

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!

like image 57
Duncan McGregor Avatar answered Oct 29 '22 08:10

Duncan McGregor