[英]Is there an overhead because of nesting Futures
我寫了這段代碼
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服務的性能。
在您的情況下,您正在使用thradpool的包裝(java.util.concurrent中的ForkJoingPool)。 當然,所有期貨都在其中執行。
import scala.concurrent.ExecutionConext.Implicits.global
基於此,您必須隱式實例化池而不是導入,如下所示:
implicit val ec: ExecutionContext
並使用ForkJoinPool中的方法: getActiveThreadCount()
第二種方法:您可以打開事件探查器(例如來自Jetbrains的JProfiler或Jvisual附帶的Jvisualvm)並查看元數據信息,包括線程參數,例如線程的數量,活動,內存使用情況等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.