multithreading - Await.result还是一个简单的电话?

标签 multithreading scala future

我正在尝试处理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/

相关文章:

c# - 如何使用 Task<T> 引发事件并等待事件完成

java - 如何处理不完整的文件?获取异常

scala - 为什么这个 future 列表到 future 列表转换编译和工作?

rust - Rust `Stream` 如何理解何时调用 `poll_next` ?

ios - 生成打印页面时更新进度条

windows - 在 Windows 中使用 IOCP 时缓存 OVERLAPPED 结构

scala - 为什么使用案例类对 JSON 进行编码时会出现错误 "Unable to find encoder for type stored in a Dataset"?

scala - Akka 和 future 的同时请求太多

scala - 更新不可变对象(immutable对象)

scala - 我一般如何处理 Scala 集合?