Page History
Info | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Future(미래)와 Promise(약속)은 JAVA 비동기처리에 있어서 중요한 개념입니다. 미래에는 블록킹이 없기때문에 어느시점 사용가능한 함수의 결과(성공또는 실패등을) 를 담을수 있는 용기라고 보면 됩니다. Scala에서 지원하는 키워드이지만 일반적으로 결과에대한 비동기적인 핸들이라고 보면 되겠으며 C#/JAVA에서도 유사한 모델을 가지고 있습니다. 이것은 AKKA의 요소가아닌 기존 개발 플랫폼의 비동기처리 요소로 나중에 Actor, Akka Stream등과 연동되는 중요한 요소로 사용이 될수 있습니다. 관련 참고 원문: 이러한 컨셉은 Java(8)/.net(4.5)에서도 지원을 합니다.
|
...
JAVA와 C#코드가 흡사합니다. 복합된 비동기처리를 위한 방식은 여러가지 방법이 있겠으나
위와같이 람다식을 활용하는 방식이 진보된 방식입니다. 활용할수도 있습니다.
Promise (미래를 위한 약속)
퓨쳐가 읽기전용 용기라고하면, 퓨쳐자체를 반환하는것을 작성하고 싶을때는 Promice를 사용합니다.
...
액터의 메시징 시스템을 블락킹하지 않고 Task에 실행을 위임한후 동시성처리를 진행한후
액터메시지의 블락킹없이 그 결과를 다시 전송받을수 있습니다.
AKKA의 Graph(DSL) 소개
Akka에서는 Graph를 활용하여, Future와 Promice를 더 우아하게 조합하여 흘러보냅니다.(+AkkaStream)
코틀린 기반
코틀린의 경우 자바가 지원하지 않는 async/await 를 지원합니다.
Code Block | ||
---|---|---|
| ||
import kotlinx.coroutines.*
fun main() = runBlocking {
val sumDeferred = async {
var sum = 0
for (i in 1..100) {
sum += i
}
sum
}
println("Sum: ${sumDeferred.await()}")
} |
AKKA의 Graph(DSL) 소개
Akka에서는 Graph를 활용하여, Future와 Promice를 더 우아하게 조합하여 흘려보냅니다.
AkkaStream처리 방식이며 동시성 처리를 위한 이러한 GRAPH동시성 처리를 위한 이러한 GRAPH-DSL기법은, 언어스펙들이 높아지면서 기본으로 담고 있는경우도 있습니다.
(ex java8에는 없지만, 12에는 이러한 컨셉이 생김 : 실제 확인은 못해보았습니다. java8에서는 이러한 GraphStream방식을 akka를 통해서 복잡한 동시성처리를 Graph로 설계할수 있습니다.)
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
actorSystem = ActorSystem.Create("ServiceB"); materializer = actorSystem.Materializer(); var g = RunnableGraph.FromGraph(GraphDsl.Create(builder => { var source = Source.From(Enumerable.Range(1, 10)); var sink = Sink.Ignore<int>().MapMaterializedValue(_ => NotUsed.Instance); var sinkConsole = Sink.ForEach<int>(x=>Console.WriteLine(x.ToString())) .MapMaterializedValue(_ => NotUsed.Instance); var broadcast = builder.Add(new Broadcast<int>(2)); var merge = builder.Add(new Merge<int>(2)); var f1 = Flow.Create<int>().Select(x => x + 10); var f2 = Flow.Create<int>().Select(x => x + 10); var f3 = Flow.Create<int>().Select(x => x + 10); var f4 = Flow.Create<int>().Select(x => x + 10); builder.From(source).Via(f1).Via(broadcast).Via(f2).Via(merge).Via(f3).To(sinkConsole); builder.From(broadcast).Via(f4).To(merge); return ClosedShape.Instance; })); g.Run(materializer); |
...