Data Engineering/Scalar

Future 컬렉션

quantapia 2018. 6. 8. 15:30

동시성 프로그래밍에 쓰인다. 그리고 어렵다.


나는 과제를 진행하면서 하나의 패키지에 Streaming Thread 와 Model Trainer Thread를 만들었고

이때 Future 를 이용하였다.


백그라운드 작업을 개시하는 concurrent.Future다. Option과 Try와 같이 퓨처(future)는 잠재적 값을 나타내며, 추가 연산을 연결하거나 값을 추출하는 안전한 연산을 제공한다.

스칼라는 자바 가상 머신 (JVM)에서 동작한다. 그리고 스칼라 코드는 JVM의 가벼운 동시성 프로세서(concurrent process)인 자바 '스레드'내에서도 동작할 수 있다. 기본 적으로 스칼라 코드는 JVM의 'main' 스레드에서 동작하지만, 병행 스레드에서 백그라운드 작업을 실행하도록 지원할 수 있다.
퓨처를 함수로 호출하면 현행 스레드가 계속 작업하는 동안 별도의 스레드에서 그 함수를 실행할 것이다.
따라서 퓨처는 그 스레드의 최종 반환값의 모나딕 컨테이너일 뿐 아니라 백그라운드 자바 스레드의 감시자(monitor)이기도 하다




비동기식으로 퓨처 처리하기

퓨처는 백그라운드 작업을 개시하는 것 외에 모나딕 컬렉션으로 처리할 수 있다. 
퓨처가 완료된 다음 실행될 함수 또는 퓨처에 첫 번째 퓨처의 성공적인 결괏값을 전달하여 연결할 수 있다.

퓨처 또는 일련의 퓨처의 최종 결과를 받기 위해 콜백 함수를 지정할 수 있다. 콜백 함수는 최종 성공적인 값 또는 예외를 받아 그 퓨처를 생성했던 원래 코드를 해제하여 다른 작업으로 넘어 갈 수 있도록 해준다.


동기식으로 퓨처 처리하기

백그라운드 스레드가 완료되기를 기다리는 동안 스레드를 차단하는 것은 자원이 많이 소모되는 작업이다. 트래픽 양이 많거나 높은 성능을 요구하는 애플리케이션이라면 이 방식을 피하고 onComplete나 onSuccess 같은 콜백 함수를 사용하는 것이 좋다.

현행 스레드를 차단하고 다른 스레드가 완료되기를 기다리기 위해서 백그라운드 스레드와 기다릴 수 있는 최대 시간을 취하는 concurrent.Await.result()를 사용한다