gpt4 book ai didi

scala - 嵌套 Future.sequence 按顺序执行包含的 Futures

转载 作者:行者123 更新时间:2023-12-03 14:07:35 30 4
gpt4 key购买 nike

我有一个 future ( doFour )被执行并将结果传递给一个平面图。
在平面图中,我再执行两个 future (doOne 和 doTwo)函数,期望它们并行运行,但我看到它们按顺序运行(2.13)。 Scastie

为什么是 doOnedoTwo不并行执行?

我怎样才能让它们并行运行?

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}

object Test {
def doOne(): Future[Unit] = Future {
println("startFirst"); Thread.sleep(3000); println("stopFirst")
}

def doTwo(): Future[Unit] = Future {
println("startSecond"); Thread.sleep(1000); println("stopSecond")
}


def doFour(): Future[Unit] = Future {
println("do 4"); Thread.sleep(1000); println("done 4")

}


def main(args: Array[String]) {


val resOut = doFour().flatMap { a =>

val futureOperations = Seq(doOne(), doTwo())

val res = Future.sequence(futureOperations)
res
}

val stream = Await.result(resOut, Duration.Inf)
}
}

最佳答案

一个 Future一经创建即有资格执行。所以这一行创建了两个 Futures可能会被执行:

val futureOperations = Seq(doOne(), doTwo())

调用 Future.sequence将创建一个新的 Future那个 等待 对于每个 future 依次完成,但它们都已经可以在代码中的这一点执行。
val res = Future.sequence(futureOperations)

如果你想要 Future转至 开始 您需要依次使用 map/flatMap :
val res = doOne().map( _ => doTwo())

使用此代码 doTwo直到 doOne 才会被调用完成(如果 doOne 失败则完全不完成)

这在您的示例中似乎没有发生的原因是您在 Future 中调用了阻塞操作。它阻塞了一个线程,否则该线程将用于执行其他 Future s。所以虽然有两个 Future s 可供执行,实际上一次只有一个正在执行。

如果您将代码标记为 blocking它工作正常:
import scala.concurrent.blocking

def doOne(): Future[Unit] = Future {
blocking{println("startFirst"); Thread.sleep(3000); println("stop First")}
}

def doTwo(): Future[Unit] = Future {
blocking{println("startSecond"); Thread.sleep(1000); println("stop Second")}
}

有关为什么不同版本的默认行为不同的详细信息,以及为什么您永远不应该对独立 Future 的相对执行顺序进行假设,请参阅评论部分。 s。

关于scala - 嵌套 Future.sequence 按顺序执行包含的 Futures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61401511/

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