You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

Future(미래)와 Promice(약속)은 비동기처리에 있어서 중요한 개념입니다.

미래에는 블록킹이 없기때문에 어느시점 사용가능 해지는 함수의 결과(성공또는 실패등을)

를 담을수 있는 용기라고 보면 됩니다.

Scala에서는 이러한 기능을 위해 동일한 키워드를 지원하며 일반적으로 결과에대한

비동기적인 핸들이라고 이해하시면 되겠으며 C#/JAVA에서도 유사하게 활용이 가능합니다.


관련 참고 원문: 이러한 컨셉은 Java(8)/.net(4.5)의 경우 최신 버젼에서 지원하는것으로 보아 scala에서 영향을 준것으로 보입니다.


자바7의 java.util.concurrent.Future에 익숙하다면 scala.concurrent.Future가 자바 클래스를 감싼것으로 생각할수도 있지만

실제로는 그렇지 않다. java.util.concurrent.Future 클래스는 폴링을 필요로하며 결과를 얻기위해 블로킹 get 메서드를 사용해야만

한다. 하지만 스칼라의 퓨쳐는 블로킹이나 풀링을 사용하지 않고 함수결과를 조합할수 있으며

JAVA8의 CompletetableFuture<T>가 오히려 여기서 설명하는 퓨쳐와 유사하다.




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);
  }
          
}

이것은 기존에 가진 모듈을(액터모델에 맞지않은) 모두 액터로 변환하여 불필요하게 복잡성을

늘릴필요가 없을시 기존 비동기처리 코드를 재사용하여 파이프를 통해 액터와 유연하게 연동이 가능합니다.



Promice




  • No labels