scala에서는 Future보다는 Promise를 많이 사용한다.
Promise를 사용해 Future를 생성하고 완료할 수 있다. Promise는 Future에 포함된 값을 명시적으로 설정할 수 있는 핸들이다.
import scala.concurrent.Promise
val p = Promise[Int]
println(p.future.value)
println(p.success(42))
println(p.future.value)
결과는 다음과 같다.
None
Success(42)
Some(Success(42))
sucess나 fail을 호출해야 future 값을 얻는 구조이다.
그리고, Promise에서 Future를 가지고 사용할 수도 있다.
import scala.concurrent.Promise
val promise = Promise[String]()
val future = promise.future
println(future.value)
println(promise.success("hello").isCompleted)
println(future.value.get)
결과는 다음과 같다. Promise가 계산되어야 future 값을 얻을 수 있다.
None
true
Success(hello)
Promise는 case class에서도 사용할 수 있다.
case class Person(number: Int)
val person = Promise[Person]
person.success(Person(10))
println(person.future.value)
참고로 play2 프레임워크에는 비동기 Promise를 사용하는 예제가 있다.
https://playframework.com/documentation/2.5.x/ScalaAsync
import play.api.libs.concurrent.Execution.Implicits.defaultContext
val futurePIValue: Future[Double] = computePIAsynchronously()
val futureResult: Future[Result] = futurePIValue.map { pi =>
Ok("PI value computed: " + pi)
}
'scala' 카테고리의 다른 글
[scala] 부분 적용 함수 / 커링 / 부분 함수 (0) | 2016.12.05 |
---|---|
[scala] 꼬리 재귀(tail recursion)와 @tailrec (0) | 2016.12.05 |
[scala] Future 2 (0) | 2016.11.23 |
[scala] Future 1 (0) | 2016.11.22 |
[zeppelin] spark의 변수 공유하기 (0) | 2016.11.18 |