我写了这段代码
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观察它。这就是我所看到的
因此应用程序启动了2个线程ForkJoinPool-1-worker-5和ForkJoinPool-2-worker-3。但是,即使我删除了嵌套,它也会启动相同的2个线程。所以我不确定是什么开销因为如上所述嵌套期货。
编辑::有些人说这取决于ThreadPool(ForkJoin等)的类型。
我不知道Akka.HTTP或Spray使用什么类型的游泳池?我打算在Spray Web服务中使用类似于上面的代码片段。我们的想法是使用Futures来衡量Web服务的性能。
答案 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)并观察元信息,包括线程参数,如数量,活动,内存使用等。