scala - 是否有标准的 Scala 函数来运行一个超时的 block ?

标签 scala concurrency

我需要调用可能会或不会及时返回结果的服务。我希望能够写作

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/

相关文章:

scala - 如何遍历集合并为集合中的每个项目分配新值?

scala - "become"是如何在支持actor模型的语言中实现的?

java - 多线程下的 JList 重绘方法

java - 如何识别被取消的 ScheduledFuture 是否真的没有被取消?

Scala Actor 阻塞当前线程

类型参数中的Scala类型级标识函数

java - 使用 deeplearning4j 训练简单的神经网络

Scala 将隐式转换优先于 "natural"操作......为什么?这是一个错误吗?还是我做错了什么?

scala - 如何编写嵌套查询?

java - Tomcat并发