gpt4 book ai didi

scala - Future.traverse是否保证执行顺序

转载 作者:行者123 更新时间:2023-12-01 22:53:51 30 4
gpt4 key购买 nike

我正在使用 Future.traverse,保证执行顺序。我的函数 fn 必须被调用并且 future 在运行下一个元素之前完成。

val xs = Seq[T] ???
def fn(t: T): Future[Unit] = ???
Future.traverse(xs)(fn)

谢谢,

最佳答案

实现traverse在 Scala 2.11 中:

  def traverse[A, B, M[X] <: TraversableOnce[X]](in: M[A])(fn: A => Future[B])(implicit cbf: CanBuildFrom[M[A], B, M[B]], executor: ExecutionContext): Future[M[B]] =
in.foldLeft(successful(cbf(in))) { (fr, a) =>
val fb = fn(a)
for (r <- fr; b <- fb) yield (r += b)
}.map(_.result())

val fb = fn(a)创建 Future[B]然后才与先前创建的 future for (r <- fr; b <- fb) yield (r += b) 组合.所以答案是否定的。没有执行顺序保证。

在 scala 2.12 中实现改变了:

def traverse[A, B, M[X] <: TraversableOnce[X]](in: M[A])(fn: A => Future[B])(implicit cbf: CanBuildFrom[M[A], B, M[B]], executor: ExecutionContext): Future[M[B]] =
in.foldLeft(successful(cbf(in))) {
(fr, a) => fr.zipWith(fn(a))(_ += _)
}.map(_.result())(InternalCallbackExecutor)

但“下一个” future 再次创建之前(zipWith 的第一个参数是“按值调用”)与前一个 fr 链接.

如果你需要顺序遍历那么只需要对2.11的实现做一点改动:

def traverse[A, B, M[X] <: TraversableOnce[X]](in: M[A])(fn: A => Future[B])(implicit cbf: CanBuildFrom[M[A], B, M[B]], executor: ExecutionContext): Future[M[B]] =
in.foldLeft(successful(cbf(in))) { (fr, a) =>
for (r <- fr; b <- fn(a)) yield (r += b)
}.map(_.result())

关于scala - Future.traverse是否保证执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44513544/

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