差异Await.ready和Await.result

时间:2016-12-15 17:43:17

标签: scala future

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

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

两者有什么区别?

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

3 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:2)

一般来说,两者都是封锁的。

区别在于Await.ready在给定时间内完成(成功或失败)之前阻塞。

唯一的区别是ready阻止Awaitable准备好,result确实产生结果类型T

<强> Postscriptum: 实际上,如果要执行错误检查或日志记录等操作,如果要编写结果并在出现错误时抛出错误,请执行Await.ready(...)

根据经验 - 尽量避免等待。

答案 2 :(得分:1)

两者都最多阻止给定的master。但是,Duration尝试立即返回将来的结果,并且如果将来失败了,则会抛出异常,而Await.result返回的是完成结果(Await.readySuccess)可以通过Failure属性安全地提取。

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

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 } 时,超时异常和失败的期货异常会“混合”。

Await.result