source

미래와 약속의 차이점은 무엇입니까?

factcode 2023. 1. 29. 20:16
반응형

미래와 약속의 차이점은 무엇입니까?

차이가 있나요?Future ★★★★★★★★★★★★★★★★★」Promise
둘 다 미래의 결과에 대한 자리 표시자 역할을 하지만, 가장 큰 차이점은 무엇일까요?

(지금까지의 답변이 완전히 만족스럽지 않기 때문에, 이쪽에서 시험해 보겠습니다.)

케빈 라이트의 코멘트는

당신은 약속을 할 수 있고 그것을 지키는 것은 당신에게 달려 있습니다.다른 사람이 당신에게 약속을 할 때 당신은 그들이 미래에 약속을 지킬지 지켜봐야 한다.

요약은 잘 되어 있습니다만, 몇 가지 설명이 도움이 될 수 있습니다.

미래와 약속은 매우 비슷한 개념입니다.다른 점은 미래는 아직 존재하지 않는 결과에 대한 읽기 전용 컨테이너인 반면 약속은 (보통 한 번만) 쓸 수 있다는 것입니다).Java 8 Completable미래구아바 정착지장래는 약속이라고 생각할 수 있습니다.그것은, 장래의 가치를 설정할 수 있기 때문입니다.그러나 장래의 인터페이스도 실장할 수 있기 때문입니다.따라서 클라이언트는 차이가 없습니다.

미래의 결과는 "다른 사람"에 의해 결정될 것입니다. 즉, 비동기 연산의 결과에 의해 결정됩니다.FutureTask(전통적인 미래 태스크)는 Callable 또는 Runnable로 초기화해야 하며 인수 생성자는 없으며 FutureTask와 FutureTask는 모두 외부에서 읽기 전용입니다(FutureTask의 설정된 메서드는 보호됩니다).이 값은 내부에서 계산한 결과로 설정됩니다.

한편, 약속의 결과는 퍼블릭 세터 방식이기 때문에 언제든지 "당신"에 의해(또는 사실상 누구에 의해) 설정할 수 있다.둘 다 완성 가능미래 및 설정 가능태스크 없이 미래를 만들 수 있으며, 그 가치는 언제든지 설정할 수 있습니다.클라이언트 코드로 약속을 전송하고 나중에 원하는 대로 이행합니다.

Complete table에 주의해 주세요.미래는 '순수한' 약속이 아니라 '미래 태스크'와 같은 태스크로 초기화할 수 있으며, 가장 유용한 기능은 처리 단계의 관련 없는 연결입니다.

또한 약속은 미래의 하위 유형일 필요가 없으며 동일한 개체일 필요도 없습니다.Scala에서 Future 객체는 비동기 계산 또는 다른 Promise 객체에 의해 생성됩니다.C++에서도 상황은 비슷합니다.약속 객체는 생산자에 의해 사용되고 미래 객체는 소비자에 의해 사용됩니다.이 분리의 장점은 클라이언트가 미래의 가치를 설정할 수 없다는 것입니다.

Spring과 EJB 3.1에는 모두 Scala/C++ 약속과 유사한 AsyncResult 클래스가 있습니다.AsyncResult는 Future를 구현하지만 실제 미래는 아닙니다. Spring/EJB의 비동기 메서드는 백그라운드 매직을 통해 읽기 전용의 다른 Future 개체를 반환합니다.이 두 번째 "실제" 미래를 클라이언트는 결과에 액세스하기 위해 사용할 수 있습니다.

논의에 따르면Promise CompletableFutureJava 8에 포함시키기 위해 javadoc은 다음과 같이 설명합니다.

명시적으로 완료(값 및 상태 설정)할 수 있으며 완료 시 트리거되는 종속 기능 및 액션을 지원하는 Completion Stage로 사용할 수 있는 미래입니다.

리스트에는, 다음의 예도 기재되어 있습니다.

f.then((s -> aStringFunction(s)).thenAsync(s -> ...);

최종 API는 약간 다르지만 유사한 비동기 실행을 허용합니다.

CompletableFuture<String> f = ...;
f.thenApply(this::modifyString).thenAccept(System.out::println);

나는 이미 받아들여진 답변이 있다는 것을 알고 있지만, 그럼에도 불구하고 나의 의견을 덧붙이고 싶다.

TLDR: Future와 Promise는 비동기 조작의 양면입니다.소비자/발신자 대 생산자/실현자입니다.

비동기 API 메서드의 호출자로서 계산 결과에 대한 핸들로서 를 얻을 수 있습니다.예를 들어 전화할 수 있습니다.get()계산이 완료될 때까지 기다렸다가 결과를 가져옵니다.

이제 이 API 메서드가 실제로 구현되는 방법에 대해 생각해 보겠습니다.실장자는 다음 명령어를 반환해야 합니다.Future지금 당장.계산은 완료되는 대로 완료할 책임이 있습니다(디스패치 로직을 실장하고 있기 때문에 알 수 있습니다)./CompletableFuture를 사용하여 다음을 수행합니다.구축 및 반환CompletableFuture전화 주세요.complete(T result)계산을 마치면요.

Promise가 무엇이고, 그 값이 언제 어떻게 설정될 수 있는지, 읽을 수 있는 Future와는 반대로 예를 들어 보겠습니다.

엄마가 있는데 엄마가 돈을 달라고 한다고 가정해 보자.

// Now , you trick your mom into creating you a promise of eventual
// donation, she gives you that promise object, but she is not really
// in rush to fulfill it yet:
Supplier<Integer> momsPurse = ()-> {

        try {
            Thread.sleep(1000);//mom is busy
        } catch (InterruptedException e) {
            ;
        }

        return 100;

    };


ExecutorService ex = Executors.newFixedThreadPool(10);

CompletableFuture<Integer> promise =  
CompletableFuture.supplyAsync(momsPurse, ex);

// You are happy, you run to thank you your mom:
promise.thenAccept(u->System.out.println("Thank you mom for $" + u ));

// But your father interferes and generally aborts mom's plans and 
// completes the promise (sets its value!) with far lesser contribution,
// as fathers do, very resolutely, while mom is slowly opening her purse 
// (remember the Thread.sleep(...)) :
promise.complete(10); 

그 출력은 다음과 같습니다.

Thank you mom for $10

엄마의 약속은 만들어졌지만, 어떤 "완료" 행사를 기다렸다.

CompletableFuture<Integer> promise...

당신은 그녀의 약속을 받아들이고 어머니께 감사할 계획을 발표하면서 그런 이벤트를 만들었습니다.

promise.thenAccept...

이때 엄마가 지갑을 열기 시작했는데...하지만 매우 느리다...

그리고 네 엄마 대신 아빠가 훨씬 더 빨리 간섭해서 약속을 지켰어

promise.complete(10);

제가 명시적으로 쓴 집행자를 보셨나요?

흥미롭게도 기본 암묵적 실행자(commonPool)를 대신 사용하고 아버지가 집에 없고 '저속 지갑'을 가진 엄마만 있다면, 엄마가 지갑에서 돈을 받아야 하는 것보다 프로그램이 오래 살 때에만 그녀의 약속은 완료됩니다.

디폴트 실행자는 데몬과 같은 동작을 하며 모든 약속이 이행될 때까지 기다리지 않습니다.나는 이 사실에 대한 좋은 묘사를 찾지 못했다...

이것이 해답이 될 수 있을지는 모르겠지만, 다른 사람이 말하는 것을 보면, 이 두 개념 모두에 대해 두 개의 다른 추상화가 필요한 것처럼 보일 수 있습니다.Future)는, 상대편( )의 읽기 전용 표시입니다.Promise...하지만, 실제로는 이것은 필요 없습니다.

예를 들어 javascript에서 약속이 어떻게 정의되는지 살펴봅니다.

https://promisesaplus.com/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

초점은, 다음의 컴포넌트에 있습니다.then다음과 같은 방법:

asyncOp1()
.then(function(op1Result){
  // do something
  return asyncOp2();
})
.then(function(op2Result){
  // do something more
  return asyncOp3();
})
.then(function(op3Result){
  // do something even more
  return syncOp4(op3Result);
})
...
.then(function(result){
  console.log(result);
})
.catch(function(error){
  console.log(error);
})

이는 비동기 계산을 동기식으로 보이게 합니다.

try {
  op1Result = syncOp1();
  // do something
  op1Result = syncOp2();
  // do something more
  op3Result = syncOp3();
  // do something even more
  syncOp4(op3Result);
  ...
  console.log(result);
} catch(error) {
  console.log(error);
}

꽤 멋지죠.(비동기 대기만큼 쿨하지는 않지만 비동기 대기에서는 보일러 플레이트 ......(function(result) {...)를 제거합니다).

그리고 사실 그들의 추상화는 약속의 작성자로서 꽤 훌륭하다.

new Promise( function(resolve, reject) { /* do it */ } );

2개의 콜백을 제공하는데, 이 콜백을 사용하여 를 완료할 수 있습니다.Promise정상적으로 또는 에러가 발생하고 있습니다.그래서 이 코드를 구성하는 유일한 코드뿐입니다.Promise를 완료할 수 있으며, 이미 구성된 코드를 수신할 수 있습니다.Promise오브젝트에는 읽기 전용 뷰가 있습니다.

해결 거부가 보호되는 방법인 경우 상속을 통해 위와 같은 작업을 수행할 수 있습니다.

클라이언트 코드의 경우 Promise는 결과를 얻을 수 있을 때 콜백을 감시하거나 부가하는 것입니다.Future는 결과를 기다렸다가 계속 진행합니다.이론적으로 약속으로 할 수 있는 것은 무엇이든 미래에 할 수 있지만, 스타일 차이로 인해 다른 언어로 약속에 대한 API는 체인을 더 쉽게 만듭니다.

Future 인터페이스에는 set 메서드가 없습니다.메서드만 취득하면 읽기 전용입니다.Complete table에 대해서미래, 이 기사는 도움이 될 수 있다.완전 가능한 미래

Future ★★★★★★★★★★★★★★★★★」Promise result 。

Promise 완성하다Future

  • Promise알수 없는 쓰기 수 없음 - 알 수 없는 결과 쓰기/알 수 없음. - 알 수 없음/알 수 없음
  • Future가 알 수 없는 경우 보류 중, 이행 완료 보류 , 취소 취소됨 등있습니다.
//Future has a reference to Promise
Future -> Promise

producer I promise이 있다

consumer를 했다.promise 것 .futurefuture는 를를사사할 the the the the the the the 를 사용할 수 있어요.promise 거절하다

CompletableFutures그것은 이다Promise 그 할 수 , 그 할 수 있기 입니다.Future

예에서는 Java에서 Promise를 사용하여 콜의 비동기 시퀀스를 작성하는 방법을 살펴볼 수 있습니다.

doSomeProcess()
    .whenResult(result -> System.out.println(String.format("Result of some process is '%s'", result)))
    .whenException(e -> System.out.println(String.format("Exception after some process is '%s'", e.getMessage())))
    .map(String::toLowerCase)
    .mapEx((result, e) -> e == null ? String.format("The mapped result is '%s'", result) : e.getMessage())
    .whenResult(s -> System.out.println(s));

언급URL : https://stackoverflow.com/questions/14541975/whats-the-difference-between-a-future-and-a-promise

반응형