使用Scala Futures按顺序执行依赖关系



我有一个任务运行程序,如下

package taskman
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
final class Task private (
desc: String,
dependencies: Seq[Task] = Seq.empty[Task],
body: => Unit
) {
def run(): Future[Unit] = Future {
//    println(s"Executing dependencies for $desc")
Future
.sequence(dependencies.map(_.run()))
.map { _ => body }
}
}
object Task {
def task(desc: String, dependencies: Seq[Task] = List.empty[Task])(
body: => Unit
): Task =
new Task(desc, dependencies, body)
}
object taskTest extends App {
import Task._
val boilWater = task("Boil water") {
println("Boiling water ")
}
val boilMilk = task("Boil milk") {
println("Boiling milk")
}
val mixWaterAndMilk =
task("Mix milk and water", Seq(boilWater, boilMilk)) {
println("Mixing milk and water")
}
val addCoffeePowder = task("Add coffee powder", Seq(mixWaterAndMilk)) {
println("Adding coffee powder")
}
val addSugar = task("Add sugar", Seq(addCoffeePowder)) {
println("Adding sugar")
}
val makeCoffee = task("Make coffee", Seq(addSugar)) {
println("Coffee is ready to serve")
}
Await.result(makeCoffee.run, 10.seconds)
}

我希望依赖项并行运行,并在完成后执行主体。但我总是把它按错误的顺序排列。

预期订单如下

沸水煮牛奶混合牛奶和水添加咖啡粉添加糖咖啡已准备好供应

煮牛奶和水可以按任何顺序进行,但其余的事情应该按顺序进行。我正在Future.sequence.map{}上执行正文,但顺序仍然不正确。这个代码肯定有问题,但我无法解决。

问题是run中的伪额外Future

def run(): Future[Unit] = Future { // <-- Not required
Future
.sequence(dependencies.map(_.run()))
.map { _ => body }
}

删除它修复了问题:

def run(): Future[Unit] = 
Future
.sequence(dependencies.map(_.run()))
.map { _ => body }

最新更新