当我们尝试从参与者的接收方法中启动多个期货时,我们观察到一种奇怪的行为。如果我们将配置的调度程序用作ExecutionContext,则期货将在同一线程上按顺序运行。如果我们使用ExecutionContext.Implicits.global,则期货将按预期并行运行。
我们将代码简化为以下示例(下面是一个更完整的示例):
implicit val ec = context.getDispatcher
Future{ doWork() } // <-- all running parallel
Future{ doWork() }
Future{ doWork() }
Future{ doWork() }
Future {
Future{ doWork() }
Future{ doWork() } // <-- NOT RUNNING PARALLEL!!! WHY!!!
Future{ doWork() }
Future{ doWork() }
}
Run Code Online (Sandbox Code Playgroud)
一个可编译的示例如下:
import akka.actor.ActorSystem
import scala.concurrent.{ExecutionContext, Future}
object WhyNotParallelExperiment extends App {
val actorSystem = ActorSystem(s"Experimental")
// Futures not started in future: running in parallel
startFutures(runInFuture = false)(actorSystem.dispatcher)
Thread.sleep(5000)
// Futures started in future: running in …Run Code Online (Sandbox Code Playgroud)