[scala] Future말고 Promise

scala 2016. 11. 27. 22:30



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
Posted by '김용환'
,