我正在尝试处理futures
。两者之间有主要区别吗?
//1
import scala.concurrent.Await
import scala.concurrent.Future
import scala.concurrent.duration._
def longRequestToServer(): String = {...}
val future = Future { longRequestToServer() }
val resultAsync = Await.result(future, 60.seconds)
和
//2
val resultSync = try {
longRequestToServer()
} catch {
case _: Exception => "???"
}
除了第一种情况下的
60 seconds
的时间段。
最佳答案
封锁是邪恶的。
将来阻塞然后等待结果将占用两个线程,而不是一个线程。
那是邪恶的两倍吗?
这是您要避免的阻止调用。
(将来,您至少希望将其包装在blocking
中,以使其成为邪恶的一半。确切的比率实际上是.666邪恶。)
编辑:其他要考虑的是,两个版本在关机时可能具有不同的行为。在第一种情况下, future 可以被拒绝。协调这些效果,尤其是与多个自定义执行程序和回调配合使用时,相对微妙且容易出错。 (这是人们更喜欢 Actor 而不是 future 的时候。)
(早期,对于所有可 throw 的东西而言, future 并不完全可靠,因此您可能无法在辅助线程上看到错误,但是AFAIK是固定的。)
关于multithreading - Await.result还是一个简单的电话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20174052/