差异Await.ready和Await.result

oct*_*ian 27 scala future

我知道这是一个非常开放的问题,我道歉.

我可以看到Await.ready返回Awaitable.typeAwait.result返回,T但我仍然混淆它们.

两者有什么区别?

是一个阻止而另一个是非阻塞?

soo*_*ote 35

它们都阻塞直到将来完成,差异只是它们的返回类型.

Future抛出异常时,差异很有用:

def a = Future { Thread.sleep(2000); 100 }
def b = Future { Thread.sleep(2000); throw new NullPointerException }

Await.ready(a, Duration.Inf) // Success(100)
Await.ready(b, Duration.Inf) // Failure(java.lang.NullPointerException)

Await.result(a, Duration.Inf) // 100
Await.result(b, Duration.Inf) // crash with java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

  • 如果我没有记错的话,`Await.ready`不会直接返回`Try`,但是您必须首先通过`Await.ready(a,d).value.get`从将来提取它。 (2认同)

lex*_*x82 13

两者都阻塞最多给定的Duration. 但是,Await.result尝试立即返回未来结果并在未来失败时抛出异常,同时Await.ready返回可以通过属性安全地从中提取结果(SuccessFailure)的完整未来value

当您还必须处理超时时,后者非常方便:

val future = Future { Thread.sleep(Random.nextInt(2000)); 123 }

Try(Await.ready(future, 1.second)) match {
    case Success(f) => f.value.get match {
      case Success(res) => // handle future success 
      case Failure(e) => // handle future failure
    }
    case Failure(_) => // handle timeout
}
Run Code Online (Sandbox Code Playgroud)

使用时Await.result,超时异常和期货失败的异常“混在一起”。

Try(Await.result(future, 1.second)) match {
    case Success(res) => // we can deal with the result directly
    case Failure(e) => // but we might have to figure out if a timeout happened
}
Run Code Online (Sandbox Code Playgroud)