首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Await.ready和Await.result的差异

Await.ready和Await.result的差异
EN

Stack Overflow用户
提问于 2016-12-16 01:43:17
回答 3查看 24.6K关注 0票数 44

我知道这是一个相当开放的问题,我道歉。

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

这两者有什么不同?

一个是阻塞的,另一个是非阻塞的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-16 02:15:40

它们都会阻塞,直到将来完成,不同之处只是它们的返回类型。

当您的Future抛出异常时,这种差异很有用:

代码语言:javascript
复制
def a = Future { Thread.sleep(2000); 100 }
def b = Future { Thread.sleep(2000); throw new NullPointerException }

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

Await.result(a, Duration.Inf) // 100
Await.result(b, Duration.Inf) // crash with java.lang.NullPointerException
票数 47
EN

Stack Overflow用户

发布于 2019-04-09 03:49:30

这两种方法都至多阻塞给定的Duration。但是,Await.result尝试立即返回未来结果,如果未来失败则抛出异常,而Await.ready返回完整的未来,可以通过value属性安全地从中提取结果(SuccessFailure)。

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

代码语言:javascript
复制
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时,超时异常和来自失败期货的异常被“混淆”。

代码语言:javascript
复制
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
}
票数 14
EN

Stack Overflow用户

发布于 2016-12-16 02:09:18

一般来说,两者都是阻塞的。

不同之处在于,在给定的时间内,Await.ready会一直阻塞,直到Future完成(成功或失败)。

唯一的区别是,ready会一直阻塞,直到Awaitable就绪,并且result会生成结果类型T

Postscriptum:在实践中,如果你想执行一些操作,比如错误检查或日志记录,如果你想合成结果并抛出错误,就需要使用Await.ready(...)。如果出现问题,则使用Await.result(...)

经验法则--尽量避免等待。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41170280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档