2014-05-16 4 views
2

컨트롤러에 아래 작업이 있다고 가정 해 봅시다. 각 요청에서 performLogin은 많은 사용자에 의해 호출됩니다.플레이 프레임 워크 : thread-pool-executor vs fork-join-executor

def performLogin() = { 
    Async { 
     // API call to the datasource1 
     val id = databaseService1.getIdForUser(); 

     // API call to another data source different from above 
     // This process depends on id returned by the call above 
     val user = databaseService2.getUserGivenId(id); 

     // Very CPU intensive task 
     val token = performProcess(user) 

     // Very CPU intensive calculations 
     val hash = encrypt(user) 

     Future.successful(hash) 
    } 
} 

나는 fork-join-executor가하는 일을 잘 알고 있습니다. 기본적으로 요청을받는 주 스레드로부터 여러 작업 스레드에 이르기까지 여러 스레드에 걸쳐 작업을 분할하여 작업을 몇 개의 덩어리로 나눕니다. 결국 메인 쓰레드는 그 결과를 결합하고 함수로부터 리턴 할 것이다.

반면에 thread-pool-executor를 선택한다면 이해할 수있는 것은 스레드 풀에서 스레드를 선택하고 선택된 스레드가 작업을 수행 한 다음 다시 스레드 풀로 이동하는 것입니다. 더 많은 일을 경청하십시오. 따라서 여기에서 일어나는 작업을 하위로 나눌 필요가 없습니다.

위의 코드에서 fork-join 실행자에 의한 병렬 처리는 내 의견으로는 불가능합니다. 다른 메소드/함수를 호출 할 때마다 이전 단계의 내용이 필요합니다. 스레딩을 위해 포크 - 조인 집행자를 선택한다면 어떻게 될까요? 위의 코드 실행은 fork-join 대 thread-pool 실행자간에 어떻게 다릅니 까?

감사

+1

performLogin이 해당 실행 프로그램을 사용하는 유일한 로직이고, 연속적으로 실행되며 결코 병렬로 실행되지 않습니다 (여러 사용자가 아마도 그렇겠습니까?). 그것보다 다른 비동기 단계로 나누면 다른 논리가 그 사이에서 실행할 기회를 가질 수 있습니다 : Future (databaseService1.getIdForUser()). map (databaseService2.getUserGivenId) .map (performProcess) .map (암호화) –

답변

4

이것은 하나 개의 스레드에서 실행됩니다 Async 전화의 내부 코드, 모든 평행하지 않습니다. 사실, 플레이! never은 요청에 대한 응답으로 새 스레드를 생성합니다. 이는 이벤트 기반이므로 수행해야 할 작업을 처리하는 기본 스레드 풀이 있습니다.

집행자가 Akka 액터에서 가장 선물 (또는 Future.successfulFuture.failed으로 생성되지 않은)에서 작업 스케줄링 처리한다. 이 경우, 각 요청은 실행 프로그램이 스레드에 대해 스케줄해야하는 별도의 태스크가됩니다.

효율성을 향상시키는 작업 도용을 허용하기 때문에 fork-join-executor가 thread-pool-executor를 대체했습니다. 두 집행자와 병렬화 할 수있는 것에는 차이점이 없습니다.

+0

내가 이해하지 못하는 것은 당신이 언급 한 "Work Stealing"이라는 용어입니다. 위의 코드에서 설명한대로 아무 것도 할 수 없습니다. 모든 것은 하나의 블록 = 하나의 스레드로 수행되어야합니다. 당신은 정교 할 수 있습니까? – Mayumi

+0

기본적으로 작업을 처리하는 큐를 공유하는 스레드 대신 각 스레드는 자체 큐를 가지고 있습니다. 큐가 실행되면 try, 다른 스레드의 큐 중 하나에서 작업의 절반을 훔칩니다 (이 예제는 작업 훔치기가 이보다 더 광범위합니다). 병렬 수집 프레임 워크의 [이 백서] (http://infoscience.epfl.ch/record/150220/files/pc.pdf)는이 주제에 대해 잘 설명되어 있습니다. – wingedsubmariner