gpt4 book ai didi

scala - Future.zip 和 Future.zipWith 实现的细微差别。为什么?

转载 作者:行者123 更新时间:2023-12-04 18:38:17 25 4
gpt4 key购买 nike

让我们考虑以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com