2016-08-11 1 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

을 보았다 응용 프로그램이 ForkJoinPool-1-노동자 5 ForkJoinPool-2-노동자-3 2 개 스레드를 시작하는 것이다. 그러나 중첩을 제거하더라도 동일한 2 개의 스레드가 실행됩니다. 그래서 위와 같은 미래를 중첩하기 때문에 오버 헤드가 무엇인지 확신 할 수 없습니다.

편집 :: 어떤 사람들은 ThreadPool (ForkJoin 등)의 유형에 달려 있다고 말합니다.

Akka.HTTP 또는 스프레이가 어떤 유형의 풀을 사용하는지 알 수 없습니까? Spray 웹 서비스에서 위 코드와 유사한 코드 스 니펫을 사용할 계획이었습니다. 아이디어는 Futures를 사용하여 웹 서비스의 성능을 측정하는 것이 었습니다.

+1

은 하드웨어 아키텍처에 따라 다름 –

답변

0

경우에 따라 랩 어라운드 thradpool (java.util.concurrent의 ForkJoingPool)을 사용하고 있습니다. 물론 모든 선물이 처형됩니다. JProfiler와 같은 ( 당신은 프로파일 러를 열 수 있습니다 ForkJoinPool에서

implicit val ec: ExecutionContext 

및 사용 방법 : getActiveThreadCount()

두 번째 방법은 암시 적으로 대신 풀 수입, 이런 인스턴스화해야한다이를 바탕으로

import scala.concurrent.ExecutionConext.Implicits.global 

- Jetbrains 또는 Jvisualvm에서 - jdk와 함께). 금액, 활동, 메모리 사용량 등과 같은 스레드 매개 변수를 포함한 메타 정보를 봅니다.

+0

나는 당신의 제안을 시도하고 위의 코드를 편집했습니다. ExecutionContext에 액세스 할 수는 있지만 getActiveThreadCount는 호출 할 수 없습니다. –