因为嵌套期货会有开销吗?

时间:2016-08-11 22:44:53

标签: scala

我写了这段代码

package com.abhi
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global

object FutureNesting extends App {

   def measure(future: => Future[Unit]) : Future[Long] = {
      val start = System.currentTimeMillis()
      val ec = implicitly[ExecutionContext]
      val t = future
      t map { case _ =>
         val end = System.currentTimeMillis()
         end - start
      }
   }

   measure(Future{ Thread.sleep(10000) }) onSuccess {case a => println(a)}
   scala.io.StdIn.readLine()
}

所以我在这段代码中使用了多少个线程。更广泛的问题是,在未来内部嵌套未来会产生什么影响。

所以我运行上面的应用程序并使用Visual VM观察它。这就是我所看到的

enter image description here

因此应用程序启动了2个线程ForkJoinPool-1-worker-5和ForkJoinPool-2-worker-3。但是,即使我删除了嵌套,它也会启动相同的2个线程。所以我不确定是什么开销因为如上所述嵌套期货。

编辑::有些人说这取决于ThreadPool(ForkJoin等)的类型。

我不知道Akka.HTTP或Spray使用什么类型的游泳池?我打算在Spray Web服务中使用类似于上面的代码片段。我们的想法是使用Futures来衡量Web服务的性能。

1 个答案:

答案 0 :(得分:0)

在您的情况下,您正在使用wrap over thradpool(来自java.util.concurrent的ForkJoingPool)。当然,所有期货都在其中执行。

 import scala.concurrent.ExecutionConext.Implicits.global

基于此,您必须隐式实例化池而不是导入,如下所示:

implicit val ec: ExecutionContext

使用ForkJoinPool的方法:getActiveThreadCount()

第二种方法: 您可以打开探查器(如JProfiler - 来自Jetbrains或Jvisualvm - 附带jdk)并观察元信息,包括线程参数,如数量,活动,内存使用等。