2016-08-11 83 views
0

的開銷,我寫了多少個線程我在這段代碼使用此代碼有沒有因爲嵌套期貨

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-工人-5和ForkJoinPool -2-工人3。但是,即使刪除嵌套,它也會啓動相同的2個線程。所以我不確定什麼是因爲嵌套像上面的期貨的開銷。

編輯::有人說它取決於ThreadPool的類型(ForkJoin等)。

我不知道Akka.HTTP或Spray使用哪種類型的池?我計劃在Spray Web服務中使用與上面類似的代碼片段。這個想法是使用Futures來衡量Web服務的性能。

+1

取決於你的硬件架構 –

回答

0

在你的情況,你正在使用覆蓋thradpool(來自java.util.concurrent的ForkJoingPool)。當然,所有期貨都在其中執行。

import scala.concurrent.ExecutionConext.Implicits.global 

在此基礎上,你必須隱式實例池代替進口,像這樣的:從ForkJoinPool

implicit val ec: ExecutionContext 

及其使用方法:getActiveThreadCount()

第二種方法: 可以打開分析器(如JProfiler的 - 來自Jetbrains或Jvisualvm - 附帶jdk)並觀看元信息,包括線程參數(如數量,活動,內存使用情況等)。

+0

我試過你的建議,並編輯了我的代碼。我可以訪問ExecutionContext,但無法調用getActiveThreadCount。 –