有时,我们必须将值提升为Future
。
以下是两种方法:
解决方案1:def lift[T](t: T) : Future[T] = Future(t)
解决方案2:def lift[T](t: T) : Future[T] = Future.successful(t)
据我所知,解决方案2似乎更具性能,因为它避免了线程机制,可能还有上下文切换。
还有其他赞成还是缺点? 还有其他解决方案吗?
答案 0 :(得分:6)
如果已经计算了你需要包装到未来的值(这是暗示的,因为"OS"
没有通过名称传递,因此已经知道了),那么选项2是这样做的方法,手下来。
选项1涉及上下文切换,实际上可能会降低性能。
但是,有时您需要执行几个廉价的内存计算(例如参数验证,没有IO),并且需要t: T
作为结果。 Future
不会产生Future,但会引发异常 - 这可能是意料之外的,因为我们倾向于将Futures作为具有其独特执行流程的语言构造处理,并且通常不会处理同步异步代码中的异常。为了保护自己免受这种情况的影响,请考虑另一种选择:
Future.successful(throw new Exception)
按名称参数将推迟计算,直到它包含在Try中,将异常(如果发生)转换为def lift[T](t: => T): Future[T] = Future.fromTry(Try(t))
而不是抛出它。