作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们考虑以下 scala.concurrent.Future.scala
的摘录:
def zip[U](that: Future[U]): Future[(T, U)] = {
implicit val ec = internalExecutor
flatMap { r1 => that.map(r2 => (r1, r2)) }
}
def zipWith[U, R](that: Future[U])(f: (T, U) => R)(implicit executor: ExecutionContext): Future[R] =
flatMap(r1 => that.map(r2 => f(r1, r2)))(internalExecutor)
f
的应用外,看起来并没有太大区别。在
zipWith
案子。我很感兴趣,为什么
internalExecutor
(仅委托(delegate)给当前线程)在
zip
中声明为隐式值因此在两个基础
map
中使用和
flatMap
调用,但仅在
flatMap
中显式使用调用
zipWith
?
f
函数执行可能涉及一些 Scala 库无法控制的阻塞或密集计算,因此用户应为其提供另一个执行上下文,以免偶尔阻塞
internalExecutor
(当前线程)。这种理解正确吗?
最佳答案
申请f
使用提供的 ExecutionContext
完成, 和 internalExecutor
用于执行展平操作。规则基本上是:当用户提供逻辑时,该逻辑在 ExecutionContext
上执行。由用户提供。
你可以想象 zipWith
被实现为 this.zip(that).map(f.tupled)
或 zip
被实现为 zipWith(Tuple2.apply)(internalExecutor)
.
关于scala - Future.zip 和 Future.zipWith 实现的细微差别。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968700/
我是一名优秀的程序员,十分优秀!