为什么我的 Scala future 没有并行执行?

eri*_*rip 3 parallel-processing scala future

Future我正在尝试并行运行一系列愚蠢的 Scala 。我有以下代码,预计需要 10 秒:

import scala.concurrent.Future
import scala.util.{Success, Failure}
import scala.concurrent.ExecutionContext.Implicits.global

def scalaFoo = Future {
  Thread.sleep(10*1000) // sleep for 10 seconds
  List(1,2,3)
}

def scalaBar = Future {
  Thread.sleep(10*1000)
  List(4,5,6)
}

def scalaBaz = Future {
  Thread.sleep(10*1000)
  List(7,8,9)
}

val flatRes: Future[List[Int]] = for {
  scalaFooRes <- scalaFoo 
  scalaBarRes <- scalaBar
  scalaBazRes <- scalaBaz
} yield (scalaFooRes ++ scalaBarRes ++ scalaBazRes)

flatRes onComplete {
  case Success(li) => println(li.foldLeft(0)(_ + _))
  case Failure(e) => println(e.getMessage)
}
Run Code Online (Sandbox Code Playgroud)

但我发现这onComplete需要大约 30 秒,所以我的作业是按顺序运行的。

我怎样才能让它们并行运行?为什么他们现在不并行运行?

she*_*nis 10

您需要在 for 表达式之前创建它们,否则它们将不会并行运行。如果将方法更改为 vals,它应该可以工作。


小智 6

您还可以使用 Future.sequence:

def scalaFoo = Future {
  Thread.sleep(3*1000) // sleep for 10 seconds
  List(1,2,3)
}

def scalaBar = Future {
  Thread.sleep(3*1000)
  List(4,5,6)
}

def scalaBaz = Future {
  Thread.sleep(3*1000)
  List(7,8,9)
}
Future.sequence(List(scalaFoo, scalaBar, scalaBaz)).onComplete({
  case Success(li) => println(li.flatten.sum)
  case Failure(e) => println(e.getMessage)
})
Run Code Online (Sandbox Code Playgroud)