簡體   English   中英

是否因為嵌套期貨而產生開銷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM