컨트롤러에 아래 작업이 있다고 가정 해 봅시다. 각 요청에서 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 실행자간에 어떻게 다릅니 까?
감사
performLogin이 해당 실행 프로그램을 사용하는 유일한 로직이고, 연속적으로 실행되며 결코 병렬로 실행되지 않습니다 (여러 사용자가 아마도 그렇겠습니까?). 그것보다 다른 비동기 단계로 나누면 다른 논리가 그 사이에서 실행할 기회를 가질 수 있습니다 : Future (databaseService1.getIdForUser()). map (databaseService2.getUserGivenId) .map (performProcess) .map (암호화) –