Future(미래)와 Promice(약속)은 비동기처리에 있어서 중요한 개념입니다.
미래에는 블록킹이 없기때문에 어느시점 사용가능 해지는 함수의 결과(성공또는 실패등을)
를 담을수 있는 용기라고 보면 됩니다.
Scala에서는 이러한 기능을 위해 동일한 키워드를 지원하며 일반적으로 결과에대한
비동기적인 핸들이라고 이해하시면 되겠으며 C#/JAVA에서도 유사하게 활용이 가능합니다.
관련 참고 원문: 이러한 컨셉은 Java(8)/.net(4.5)의 경우 최신 버젼에서 지원하는것으로 보아 scala에서 영향을 준것으로 보입니다.
- https://docs.scala-lang.org/overviews/core/futures.html (scala)
- https://msdn.microsoft.com/en-us/library/ff963556.aspx (.net)
Future
.net 에서 Actor 메시지와 비동기처리(Task)를 연동한 샘픞
public class ReActor : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public ReActor() { string myPath = Self.Path.ToString(); Receive<string>(message => { Handle(message); }); Receive<DelayReply>(message => { Handle(message); }); } public void Handle(string str) //InMessage { Task.Run(async () => { await Task.Delay(1000); //어떠한 값을 기다림 DelayReply reply = new DelayReply(); reply.message = str; return reply; }).PipeTo(Self); } public void Handle(DelayReply data) //Out { string logtrace = string.Format("I'am {0} RE:{1}", Self.Path, data.message); log.Info(data.message); Sender.Tell(data); } }
이것은 기존에 가진 모듈을(액터모델에 맞지않은) 모두 액터로 변환하여 불필요하게 복잡성을
늘릴필요가 없을시 기존 비동기처리 코드를 재사용하여 파이프를 통해 액터와 유연하게 연동이 가능합니다.