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


73

미래와 약속의 차이점은 무엇입니까? (Akka와 Gpars에서)

그들은 나에게 블록과 같게 보이고 get이 호출 될 때 미래의 가치를 반환하며 약속은 미래의 결과를 얻는 것입니다.


4
"미래는 생산자 소비자를 약속합니다". (그러나 선물 (0 이상)은 가치 소비와 유사하고 Promise (첫 번째 만이 성공할 수 있음)는 가치 창출과 유사하므로 프로그래밍을 위해 마지막 두 개를 교체하십시오.
rwong

: 마틴 오더 스키, 에릭 마이어, 롤랜드 쿤에 의해 코 세라에 미래 / 약속 "반응성 프로그래밍의 원리"에 대한 멋진 강의 class.coursera.org/reactive-001/lecture , 3 주
GKislin

@ rwong : "미래는 생산자 소비자를 약속합니다"-응? 이것은 미래와 약속의 차이를 우리에게 상기시키기 위해 니모닉으로 작용하는 의미있는 문장입니까? 내 뇌는 그것을 완전히 파싱하지 못했습니다. 또한 잘못되어 단어를 바꿔야한다고 말하지만 어떤 이유로 든 입력하기 전에이 작업을 수행하지 않았습니다. 마지막으로 인용 부호로 표시되지만 인터넷 검색은 주석 이외의 다른 결과를 가져 오지 않습니다. 당황했다.
bacar

답변:


54

저는 Gpars 나 Akka / Java에 익숙하지 않기 때문에 Akka / Scala에 대해 이야기하겠습니다.

표준 분포에 Akka의 관련 부분을 포함하는 Scala 2.10에서 a Future는 기본적으로 아직 계산되지 않은 값에 대한 읽기 전용 참조입니다. A Promise쓸 수 있다는 점을 제외 하면 거의 동일합니다 . 다시 말해, Futures와 Promises 모두에서 읽을 수 있지만 s에만 쓸 수 있습니다 Promise. 메소드를 호출하여 Futurea와 연관 시킬 수 있지만 다른 방향으로의 변환은 불가능합니다 (무의미한 것이기 때문에).Promisefuture



19

wikipedia에 따르면 , 그것들은 같은 개념입니다 :

컴퓨터 과학에서 미래, 약속 및 지연은 일부 동시 프로그래밍 언어에서 동기화하는 데 사용되는 구조를 말합니다. 그것들은 초기에 알려지지 않은 결과에 대한 프록시 역할을하는 객체를 설명합니다. 보통 그 값의 계산이 아직 불완전하기 때문입니다.

어떤 도서관은 그것들을 한 방향으로 부르기로 선택할 수도 있고 어떤 도서관은 다른 방향으로 부르기를 선택할 수도 있습니다. 그리고 매번 다른 맛으로 구현 될 수 있습니다. 일부 라이브러리는 다른 동의어를 구별하기 위해 이러한 동의어를 사용하도록 선택할 수 있습니다. 나는 이것이 잘못된 선택이라고 주장하지만 (명백히 사람들을 혼란스럽게하기 때문에) 이 링크 는 스칼라 에서이 일반적인 관행을 암시합니다.

@ Ptharien 's Flame이 제안한 것처럼 Scala a Future는 읽기 전용 작업이며 a Promise는 작업에 대한 결과 (또는 실패)를 생성하는 기능을 제공합니다.

Promise따라서 A 는 결과를 전파하기 위해 작업을 수행하는 코드에서 가장 잘 사용되며 a Future는 결과 를 클라이언트 코드에 노출하는 데 사용되며 결과적으로 결과를 기다립니다. 그러나이 차이는 스칼라에 따라 다르며 외부인을 혼동 할 수 있습니다.


JS Promises와 Python Futures도 마찬가지입니다.
Nick Sweeting

6

자바에서 미래의 수많은 미래와 함께 일하고 있지만 스칼라 / 아카카 개발에 대한 배경 지식을 가지고 있기 때문에 여기에 조금 추가 할 것입니다. 이 답변은 대부분 말한 내용을 복제하지만 오늘날 JVM에서 널리 사용되는 과다한 구현을 지적합니다.

첫째, 독창적 인 포스터에는 get 및 blocking 사용에 대한 언급이 있습니다. 절대 테스트 외부에서 수행하지 마십시오.

현재 역할에서 FP 및 동시성 개념을 가르 칠 때, 약속 또는 미래 API의 소비자로서 개발자는 의미 적으로 약속과 미래가 동의어라고 학생에게 이야기합니다. 의미 적 차이-IO를 차단하지 않고 처리하는 메커니즘 만 해당합니다.

미래가 완성 될 수없고 약속이 (예를 들어 스칼라 / 아카 / 플레이 API와 같이) 너무 단순하다고 말하기 위해서는 :

어떤 선물을 완료 할 수 Java8 이제 표준 라이브러리에 CompletableFuture을 소개합니다.

일부 약속을 완료 할 수 없습니다 약속이 성취 될 수없는 플레이 약속 API에 유사하지만, 그렇게 재생할 수있는 RedeemablePromise 다른 의미 소개 - 형태 보증 된 우산 아래에있는 동안에도. 또한 Play promise API는 (F.Promise.wrap (future) 또는 promise.wrapped ()) 양방향으로 스칼라 선물로 전환 할 수 있습니다.

Java8에서 Typesafe 기술을 사용하면 하나의 API가 선호되기 때문에 종종 선물 / 약속을 오가는 경우가 많습니다 (Play Promise API는 Java8 람다에서 더 좋아 보입니다). Akka + Play + Java8에서는 Actors에서 선물을 가져 와서 약속으로 묶고 콜백을 작성하고 컨트롤러에서 반환합니다.

따라서 제가 가르 칠 때 사람들에게 말할 때 약속과 미래는 다소 동의어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.