맨위로가기

퓨처와 프로미스

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

퓨처(Future)와 프로미스(Promise)는 동시성 프로그래밍에서 사용되는 개념으로, 계산의 결과를 나타내는 객체이다. 퓨처는 계산이 완료될 때까지 값을 저장하며, 프로미스는 퓨처의 값을 설정하는 역할을 한다.

이들은 MultiLisp, Act 1과 같은 초기 프로그래밍 언어에서 처음 구현되었으며, 동시성 논리 프로그래밍 언어와 데이터 흐름 프로그래밍 언어에서도 발전했다. 1980년대 후반 바바라 리스코프와 류바 슈리라, 그리고 마크 S. 밀러 등에 의해 프로미스 파이프라인 기법이 개발되었다.

2000년대 이후 사용자 인터페이스의 응답성 향상과 웹 개발에서의 요청-응답 모델 사용으로 인해 퓨처와 프로미스에 대한 관심이 다시 높아졌으며, Java, .NET, JavaScript 등 다양한 프로그래밍 언어에서 지원되고 있다. 퓨처는 암시적 또는 명시적으로 사용될 수 있으며, 읽기 전용 뷰, 스레드 특정 퓨처, 블로킹/비블로킹 의미 체계 등 다양한 특징을 가진다. 퓨처는 병렬 메시지 전달, 코루틴, 채널 등과 관련이 있으며, 퓨처/프로미스 구현은 다양한 프로그래밍 언어와 라이브러리에서 제공된다.

더 읽어볼만한 페이지

  • 프로세스 간 통신 - Ajax
    Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다.
  • 프로세스 간 통신 - D-Bus
    D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다.
퓨처와 프로미스
개요
종류동시성 제어 메커니즘
특징비동기 연산의 결과를 나타내는 객체
연산 완료를 기다리지 않고 결과를 얻을 수 있음
프로미스를 통해 연산 성공/실패에 따른 처리 가능
용어
퓨처 (Future)비동기 연산의 결과를 담는 읽기 전용 placeholder
프로미스 (Promise)퓨처에 값을 설정하는 역할, 쓰기 가능한 객체
활용
프로그래밍 패러다임비동기 프로그래밍
병렬 프로그래밍
반응형 프로그래밍
목적호출자와 피호출자 간의 비동기적 상호작용 지원
호출자는 즉시 반환값을 받고, 피호출자는 나중에 결과를 제공
장시간 연산으로 인한 블로킹 방지
동작 방식
퓨처 생성비동기 연산 시작 시 생성
값 설정프로미스를 통해 퓨처에 결과값 설정 (단 한 번만 가능)
결과 접근퓨처가 완료될 때까지 블로킹될 수 있음
완료 여부 확인 후 접근하거나, 콜백 함수를 통해 비동기적으로 처리 가능
장점
응답성 향상블로킹 연산 회피
병렬성여러 연산 동시 수행
코드 가독성비동기 코드 단순화
단점
복잡성 증가비동기 코드 디버깅 어려움
자원 관리메모리 누수 가능성
구현
언어 지원자바스크립트 (Promise)
C++ (std::future, std::promise)
C# (Task, TaskCompletionSource)
스칼라 (Future, Promise)
파이썬 (asyncio.Future, asyncio.Promise)
Dart (Future)
Swift (PromiseKit)
관련 패턴반응형 프로그래밍
액터 모델
콜백

2. 역사

퓨처와 프로미스 개념은 여러 프로그래밍 언어와 시스템에서 발전해왔다.

MultiLisp 및 Act 1과 같은 프로그래밍 언어에서 ''퓨처(Future)'' 및/또는 ''프로미스(Promise)'' 구조가 처음 구현되었다.[14] 동시성 프로그래밍 언어에서 퓨처와 유사한 개념이 발전되었고, 이는 ''Prolog with Freeze''와 ''IC Prolog''에서 시작되어, Relational Language, Concurrent Prolog 등 다양한 언어로 확장되었다. 데이터 흐름 프로그래밍 언어에서 파생된 단일 할당 ''I-var''는 동시 논리 변수와 매우 유사하게 작동한다.

바바라 리스코프와 류바 슈리라는 1988년에 프로미스 파이프라이닝 기법(지연을 극복하기 위해 퓨처 사용)을 발명했고,[14] 약 1989년 자나두 계획의 맥락에서 마크 S. 밀러, 딘 트리블, 롭 젤링하우스가 독립적으로 발명했다.[14] 리스코프와 슈리라는 ''프로미스(promise)''라는 용어를 만들었지만, 그들이 사용한 "호출 스트림(call-stream)"이라는 명칭은 현재는 거의 사용되지 않는다. 초기에는 프로미스 값이 일급 값이 아니라는 제한이 있었지만, 이후 Joule 및 E와 같은 언어에서는 완전히 일급 프로미스와 리졸버를 지원하게 되었다. Act 시리즈를 포함한 여러 초기 액터 언어는 병렬 메시지 전달과 파이프라인 메시지 처리를 지원했지만, 프로미스 파이프라인은 지원하지 않았다.

2000년 이후, 사용자 인터페이스의 응답성과 웹 개발에서 메시지 전달의 요청-응답 모델 사용으로 인해 퓨처와 프로미스에 대한 관심이 크게 부활했다. Java 5의 `FutureTask`(2004년 발표)[21]와 .NET 4.5의 async/await 구조(2010년 발표, 2012년 출시)[22][23]가 널리 사용되었으며, 이는 2007년 F#의 ''비동기 워크플로''에서 크게 영감을 받았다.[24][25] 이어서 Dart (2014),[29] Python (2015),[26] Hack (HHVM), 그리고 ECMAScript 7 (JavaScript), Scala, C++ (2011)의 초안에서도 채택되었다.

칼 휴이트는 future가 promise보다 더 적합한 용어라고 주장한다. 그 이유는 promise(약속)는 반드시 미래 시점을 의미하지 않기 때문에 future(미래)보다 모호하고, promise는 단순한 언어 표현이지만, future는 현물(actuals)에 대한 선물(futures)이라는 의미도 있기 때문이다. 헨리 베이커(Henry Baker (computer scientist))와 칼 휴이트의 1977년 논문에서 "퓨처" 구문이 처음 소개되었다.[19][20] 1976년 다니엘 P. 프리드먼(Daniel P. Friedman)과 데이비드 와이즈는 "프로미스"라는 용어를 제안했고, 피터 히바드가 사용했다.[14] 퓨처(프로미스)를 사용하면 분산 컴퓨팅 시스템에서 지연 시간을 획기적으로 줄일 수 있다.

2. 1. 초기 개념

1977년 헨리 베이커(Henry Baker (computer scientist))와 칼 휴이트의 논문에서 "퓨처" 구문이 처음 소개되었다.[19][20] 1976년 다니엘 P. 프리드먼(Daniel P. Friedman)과 데이비드 와이즈는 "프로미스"라는 용어를 제안했고, 피터 히바드가 사용했다.[14]

2. 2. 동시성 프로그래밍 언어에서의 발전

MultiLisp, Act 1과 같은 프로그래밍 언어에서 ''퓨처(Future)'' 및/또는 ''프로미스(Promise)'' 구조가 처음 구현되었다.[14] 동시성 논리 프로그래밍 언어에서 통신을 위해 논리 변수를 사용하는 것은 퓨처와 매우 유사했다. 이는 ''Prolog with Freeze''와 ''IC Prolog''에서 시작되었으며, Relational Language, Concurrent Prolog, guarded Horn clauses (GHC), Parlog, Strand, Vulcan, Janus, Oz-Mozart, Flow Java, Alice ML로 진정한 동시성 기본 요소가 되었다. 데이터 흐름 프로그래밍 언어에서 파생되어 Id에서 시작되어 Reppy의 ''Concurrent ML''에 포함된 단일 할당 ''I-var''는 동시 논리 변수와 매우 유사하다.

2. 3. 프로미스 파이프라이닝

바바라 리스코프와 류바 슈리라는 1988년에 프로미스 파이프라이닝 기법을 발명했다.[14] 마크 S. 밀러, 딘 트리블, 롭 젤링하우스는 1989년경 자나두 계획에서 독자적으로 프로미스 파이프라이닝을 발명했다.[14]

2. 4. 최근 동향

2000년 이후, 사용자 인터페이스의 응답성과 웹 개발에서 메시지 전달의 요청-응답 모델을 사용하면서 퓨처와 프로미스에 대한 관심이 크게 부활했다.[21] 여러 주류 프로그래밍 언어가 퓨처와 프로미스를 지원하는데, 특히 Java 5의 `FutureTask`(2004년 발표)[21]와 .NET 4.5의 async/await 구조(2010년 발표, 2012년 출시)[22][23]가 널리 사용되었다. async/await는 2007년 F#의 '비동기 워크플로'에서 크게 영감을 받았다.[24][25]

이후 Dart (2014),[29] Python (2015),[26] Hack (HHVM), ECMAScript 7 (JavaScript), Scala, C++ (2011)의 초안에서도 퓨처/프로미스 개념이 채택되었다.

3. 주요 개념

퓨처와 프로미스는 함수형 프로그래밍 및 관련 패러다임(예: 논리 프로그래밍)에서 시작되었으며, 값(퓨처)을 계산 방식(프로미스)으로부터 분리하여 계산을 더욱 유연하게 수행할 수 있도록 한다. 특히 병렬 처리를 가능하게 했다는 점에서 주목할 만하다. 이후 분산 컴퓨팅에서 통신 왕복의 지연 시간을 줄이는 데 사용되었고, 연속 전달 방식이 아닌 직접 스타일로 비동기 프로그램을 작성할 수 있게 되면서 널리 사용되고 있다.

퓨처는 액터 모델에서 `''future'' ` 형식의 표현식으로 정의된다. 이는 환경 ''E''와 고객 ''C''를 가진 `Eval` 메시지에 대한 응답으로, 고객 ''C''에게 새로 생성된 액터 ''F'' ( ``의 평가 응답에 대한 프록시)를 반환 값으로 ''동시에'' 보낸다. 이와 동시에 ``에게 환경 ''E''와 고객 ''C''를 가진 `Eval` 메시지를 보낸다. ''F''의 기본 동작은 다음과 같다.


  • ''F''가 요청 ''R''을 수신하면, ``을 평가하여 응답(반환 값 또는 예외)을 이미 받았는지 확인한다.
  • 이미 응답 ''V''를 받은 경우, ''V''가 반환 값이면 요청 ''R''을 ''V''에 보내고, ''V''가 예외면 요청 ''R''의 고객에게 예외를 발생시킨다.
  • 아직 응답을 받지 못한 경우, ''R''을 ''F'' 내부의 요청 큐에 저장한다.
  • ''F''가 ``을 평가한 결과로 응답 ''V''를 받으면, ''V''를 ''F''에 저장한다.
  • ''V''가 반환 값이면, 큐에 있는 모든 요청을 ''V''로 보낸다.
  • ''V''가 예외면, 큐에 있는 각 요청의 고객에게 예외를 발생시킨다.


하지만 일부 future는 더 큰 병렬성을 제공하기 위해 특수한 방식으로 요청을 처리할 수 있다. 예를 들어, `1 + future factorial(n)` 표현식은 `1+factorial(n)` 숫자처럼 동작하는 새로운 future를 생성할 수 있다.

칼 휴이트는 future가 promise보다 더 적합한 용어라고 주장했는데, promise(약속)는 반드시 미래 시점을 의미하지 않아 모호하고, promise는 단순 언어 표현이지만 future는 현물(actuals)에 대한 선물(futures)이라는 의미도 있기 때문이다.

future라는 구문은 1977년 헨리 베이커(Henry Baker (computer scientist))와 칼 휴이트의 논문에서 처음 소개되었다. promise라는 용어는 1976년 다니엘 P. 프리드먼(Daniel P. Friedman)과 데이비드 와이즈가 제안했고, 최종적으로 피터 히바드가 사용했다.

퓨처의 평가 전략은 ''퓨처에 의한 호출''이라고 칭할 수 있으며, 비결정적이다. 퓨처의 값은 퓨처가 생성된 시점부터 해당 값이 사용되는 시점 사이의 어느 시점에 평가되지만, 정확한 시점은 미리 결정되지 않으며 실행마다 변경될 수 있다. 계산은 퓨처가 생성되자마자 시작(즉시 평가)되거나, 실제로 값이 필요할 때만 시작(지연 평가)될 수 있으며, 중간에 일시 중단되거나 한 번의 실행으로 실행될 수 있다. 퓨처의 값이 할당되면, 이후 접근 시 재계산되지 않는다. 이는 필요에 의한 호출에서 사용되는 메모이제이션과 유사하다.

3. 1. 암시적 퓨처와 명시적 퓨처

함수형 프로그래밍 및 관련 패러다임에서 유래한 퓨처는, 그 사용 방식에 따라 암시적 퓨처와 명시적 퓨처로 나뉜다.

암시적 퓨처는 퓨처를 사용하는 모든 곳에서 마치 일반적인 참조처럼 자동으로 그 값을 얻는 방식이다. 초기 베이커와 휴이트의 논문에서는 암시적 퓨처를 설명했으며, 이는 계산의 액터 모델 및 스몰토크와 같은 순수한 객체 지향 프로그래밍 언어에서 자연스럽게 지원된다. 예를 들어, 순수한 액터 또는 객체 언어에서는 `''퓨처 '' factorial(100000)`에게 메시지 `+[3]`을 전송하여 퓨처에게 `3`을 자체에 더하고 결과를 반환하도록 요청할 수 있다. 이 방식은 `factorial(100000)`의 계산 완료 시점과 관계없이 작동하며, 값을 얻기 위한 별도의 과정이 필요하지 않다.[13]

반면, 명시적 퓨처는 사용자가 값을 얻기 위해 함수를 호출해야 하는 방식이다. 자바의 `get` 메서드가 그 예시이다. 명시적 퓨처의 값을 얻는 것을 "스팅" 또는 "포싱"이라고 부르기도 한다. 프리드먼과 와이즈의 논문에서는 명시적 퓨처만을 설명했는데, 이는 일반 하드웨어에서 암시적 퓨처를 효율적으로 구현하기 어렵기 때문으로 보인다. 예를 들어, 일반 하드웨어의 덧셈 명령은 `3 + ''퓨처 '' factorial(100000)`과 같은 표현을 처리할 수 없다.

암시적 퓨처는 일반적으로 언어의 일부로 구현되는 반면, 명시적 퓨처는 라이브러리로 구현될 수 있다.

3. 2. 프로미스 파이프라이닝

퓨처를 사용하면 분산 시스템에서 지연 시간을 크게 줄일 수 있다. 예를 들어, 퓨처는 E와 Joule에서 구현된 'promise 파이프라인'[4][5]을 가능하게 하며, 이는 Argus 언어에서는 '호출 스트림'[6]이라고도 불렸다.

전통적인 원격 프로시저 호출을 포함하는 다음 표현식을 보자.



t3 := ( x.a() ).c( y.b() )



이는 다음과 같이 확장될 수 있다.



t1 := x.a();

t2 := y.b();

t3 := t1.c(t2);



각 문은 다음 문이 진행되기 전에 메시지를 보내고 응답을 받아야 한다. 예를 들어, x, y, t1t2가 모두 동일한 원격 컴퓨터에 있다고 가정하면, 세 번째 문이 실행을 시작하기 전에 해당 컴퓨터에 대한 두 번의 완전한 네트워크 왕복이 발생해야 한다. 그러면 세 번째 문은 동일한 원격 컴퓨터에 대한 또 다른 왕복을 발생시킨다.

퓨처를 사용하면 위의 표현식을 다음과 같이 작성할 수 있다.



t3 := (x <- a()) <- c(y <- b())



이는 다음과 같이 확장될 수 있다.



t1 := x <- a();

t2 := y <- b();

t3 := t1 <- c(t2);



여기 사용된 구문은 언어 E의 구문으로, x <- a()a() 메시지를 x로 비동기적으로 보낸다는 의미이다. 세 변수 모두 즉시 결과에 대한 퓨처를 할당받고 실행은 후속 문으로 진행된다. 나중에 t3의 값을 확인하려는 시도는 지연을 유발할 수 있지만, 파이프라인을 사용하면 필요한 왕복 횟수를 줄일 수 있다. 이전 예제에서와 같이 x, y, t1t2가 모두 동일한 원격 컴퓨터에 있는 경우 파이프라인 구현은 세 번 대신 한 번의 왕복으로 t3를 계산할 수 있다. 세 메시지 모두 동일한 원격 컴퓨터에 있는 객체를 대상으로 하므로 하나의 요청만 보내고 결과가 포함된 하나의 응답만 받으면 된다. t1 <- c(t2) 전송은 t1t2가 서로 다른 컴퓨터에 있거나 x 또는 y에 있는 경우에도 차단되지 않는다.

Promise 파이프라인은 병렬 비동기 메시지 전달과 구별되어야 한다. 파이프라인은 지원하지 않지만 병렬 메시지 전달을 지원하는 시스템에서 위의 예에서 x <- a()y <- b() 메시지 전송은 병렬로 진행될 수 있지만, t1 <- c(t2) 전송은 t1t2가 모두 수신될 때까지 기다려야 한다. x, y, t1t2가 동일한 원격 컴퓨터에 있는 경우에도 마찬가지이다. 파이프라인의 상대적인 지연 시간 이점은 많은 메시지가 관련된 더 복잡한 상황에서 훨씬 커진다.

Promise 파이프라인은 또한 액터 시스템의 파이프라인 메시지 처리와 혼동해서는 안 된다. 액터 시스템에서는 액터가 현재 메시지 처리를 완료하기 전에 다음 메시지에 대한 동작을 지정하고 실행을 시작할 수 있다.

3. 3. 읽기 전용 뷰

일부 프로그래밍 언어에서는 퓨처의 ''읽기 전용 뷰''를 얻을 수 있다. 이를 통해 퓨처가 해결되었을 때 값을 읽을 수는 있지만, 퓨처를 해결하는 것은 허용하지 않는다.

  • Oz에서는 `!!` 연산자를 사용하여 읽기 전용 뷰를 얻는다.
  • E와 AmbientTalk에서 퓨처는 ''약속/해결자 쌍''이라는 두 개의 값으로 표현된다. 약속은 읽기 전용 뷰를 나타내며, 해결자는 퓨처의 값을 설정하는 데 필요하다.
  • C++11에서 `std::future`는 읽기 전용 뷰를 제공한다. 값은 `std::promise`를 사용하여 직접 설정하거나, `std::packaged_task` 또는 `std::async`를 사용하여 함수 호출의 결과로 설정된다.
  • Dojo Toolkit의 Deferred API는 버전 1.5부터 ''소비자 전용 약속 객체''가 읽기 전용 뷰를 나타낸다.[7]
  • Alice ML에서 퓨처는 ''읽기 전용 뷰''를 제공하며, 약속은 퓨처와 퓨처를 해결하는 기능을 모두 포함한다.[8][9]
  • .NET에서 `System.Threading.Tasks.Task`는 읽기 전용 뷰를 나타낸다. 값의 해결은 `System.Threading.Tasks.TaskCompletionSource`를 통해 수행할 수 있다.


읽기 전용 뷰를 지원하는 것은 최소 권한 원칙과 일치한다. 값을 설정하는 기능을 값을 설정해야 하는 주체로 제한할 수 있기 때문이다. 파이프라인을 지원하는 시스템에서 비동기 메시지 (결과 포함)의 송신자는 결과에 대한 읽기 전용 약속을 받고, 메시지의 대상은 해결자를 받는다.

3. 4. 스레드 특정 퓨처

앨리스 ML과 같은 일부 언어는 퓨처의 값을 계산하는 특정 스레드와 관련된 퓨처를 정의한다.[8] 이 계산은 퓨처가 생성될 때 즉시 평가되거나, 퓨처의 값이 처음 필요할 때 지연 평가될 수 있다. 지연 퓨처는 지연된 계산이라는 점에서 썽크와 유사하다.

'''지연 퓨처'''는 지연 평가 의미론을 결정론적으로 갖는 퓨처이다. 즉, 퓨처 값의 계산은 필요에 의한 호출에서와 같이 값이 처음 필요할 때 시작된다. 지연 퓨처는 기본적으로 평가 전략이 지연되지 않는 언어에서 유용하다. 예를 들어, C++11에서는 `std::launch::deferred` 시작 정책을 `std::async`에 전달하여 지연 퓨처를 생성할 수 있으며, 값 계산을 위한 함수와 함께 사용된다.

3. 5. 블로킹 대 비-블로킹 의미 체계

퓨처의 값을 ''즉시'' 또는 ''동기적으로'' 접근하는 경우, 다음과 같은 설계 방식이 가능하다.

  • 접근 블로킹: 퓨처가 해결될 때까지 (타임아웃 설정 가능) 현재 스레드 또는 프로세스를 블로킹한다. 오즈 언어의 데이터 흐름 변수가 이러한 의미를 갖는다.
  • 오류 신호: 동기적 접근 시도 시 항상 오류를 발생시킨다. (예: 예외 발생) E 언어의 원격 프로미스가 이러한 의미를 갖는다.[10]
  • 조건부 성공/오류: 퓨처가 이미 해결된 경우에는 접근이 성공하지만, 그렇지 않은 경우에는 오류를 발생시킨다. 이는 비결정성을 도입하고 경쟁 조건을 유발할 수 있어 흔하지 않은 설계 방식이다.


C++11에서는 퓨처의 값이 필요한 스레드가 `wait()` 또는 `get()` 멤버 함수를 호출하여 값을 사용할 수 있을 때까지 블로킹할 수 있다. 블로킹을 방지하기 위해 `wait_for()` 또는 `wait_until()` 함수를 사용하여 대기 시간에 타임아웃을 지정할 수도 있다. 퓨처가 `std::async` 호출에서 발생한 경우, 블로킹 대기는 대기 스레드에서 결과를 계산하기 위한 함수의 동기적 호출을 유발할 수 있다.[8]

4. 구현체 목록

퓨처와 프로미스는 함수형 프로그래밍에서 시작되어, 이후 분산 컴퓨팅과 비동기 프로그래밍에 널리 사용되게 되었다. 여러 프로그래밍 언어와 라이브러리에서 퓨처/프로미스 구현체를 제공하고 있다.

프로그래밍 언어 및 라이브러리에 대한 자세한 내용은 하위 섹션을 참고하면 된다.

4. 1. 프로그래밍 언어 지원


  • ABCL/f[27]
  • 앨리스 ML
  • AmbientTalk (일급 해결자 및 읽기 전용 프로미스 포함)
  • C++, C++11부터: `std::future` 및 `std::promise`
  • * μC++
  • * Compositional C++
  • Crystal
  • Dart (''Future''/''Completer'' 클래스[28] 및 ''await'', ''async'' 키워드[29] 포함)
  • Elm (''Task'' 모듈 사용[30])
  • Glasgow 하스켈 (I-var 및 M-var만 해당)
  • Id (I-var 및 M-var만 해당)
  • Io[31]
  • 자바
  • 자바스크립트 (ECMA스크립트 2015부터[32], ECMAScript 2017부터는 `async` 및 `await` 키워드를 통해 지원[33])
  • Lucid (데이터 흐름만 해당)
  • 일부 Lisps
  • * 클로저[34]
  • * MultiLisp
  • .NET (''Task'' 사용)
  • * C# (.NET Framework 4.5부터[22], `async` 및 `await` 키워드 사용[23])
  • Nim
  • Oxygene
  • Oz 버전 3[36]
  • 파이썬 ([https://docs.python.org/3/library/concurrent.futures.html concurrent.futures] 사용, 3.2부터[37], [https://www.python.org/dev/peps/pep-3148/ PEP 3148] 제안, Python 3.5는 async와 await 추가[38])
  • R (지연 평가를 위한 프로미스, 여전히 단일 스레드)
  • Racket[39]
  • Raku[40]
  • Scala ([http://docs.scala-lang.org/overviews/core/futures.html scala.concurrent 패키지] 사용)
  • Scheme
  • 스퀵 스몰토크
  • Strand
  • Swift (타사 라이브러리를 통해서만 지원)
  • Visual Basic 11 (''Async'' 및 ''Await'' 키워드 사용)[23]

4. 2. 라이브러리 기반 구현

언어라이브러리
커먼 리스프
C++
C# 및 기타 .NET 언어Parallel Extensions
GroovyGPars[146]
자바스크립트
자바
Luacqueues [https://www.25thandclement.com/~william/projects/cqueues.html] 모듈 (Promise API 포함)
오브젝티브-CMAFuture,[161][162] RXPromise,[163] ObjC-CollapsingFutures,[164] PromiseKit,[165] objc-promise,[166] OAPromise,[167]
OCamlLazy 모듈 (lazy explicit futures 구현)[168]
Future,[169] Promises,[170] Reflex,[171] and Promise::ES6[172]
PHPReact/Promise[173]
파이썬
Rfuture (lazy 및 eager 동기 및 (멀티코어 또는 분산) 비동기 future로 확장 가능한 future API 구현)[177][178]
Ruby
Rustfutures-rs[183]
ScalaTwitter's util library[184]
Swift
Tcltcl-promise[191]


5. 관련 개념

''퓨처''는 한 번만 완료될 수 있는 동기화 기본 요소인 "이벤트"의 특별한 경우이다. 일반적인 이벤트는 초기 빈 상태로 재설정될 수 있어 여러 번 완료될 수 있다.[11]

Id 언어의 ''I-var''는 위에 정의된 차단 의미 체계를 가진 퓨처이다. ''I-structure''는 I-var를 포함하는 자료 구조이다. 여러 번 설정될 수 있는 관련 동기화 구성체는 ''M-var''라고 한다. M-var는 현재 값을 "가져오거나" "넣는" 원자적 연산을 지원하며, 값을 가져오면 M-var가 초기 "비어 있는" 상태로 다시 설정된다.[12]

''병렬 논리 변수''는 퓨처와 유사하지만 통합에 의해 업데이트되며, 이는 논리 프로그래밍의 ''논리 변수''와 동일하다. 통합 가능한 값에 여러 번 바인딩될 수 있지만 빈 상태 또는 미해결 상태로 다시 설정될 수 없다. Oz의 데이터 흐름 변수는 병렬 논리 변수 역할을 하며, 차단 의미 체계도 가지고 있다.

''병렬 제약 변수''는 제약 논리 프로그래밍을 지원하기 위해 병렬 논리 변수를 일반화한 것이다. 제약 조건은 여러 번 "좁혀질" 수 있으며, 이는 가능한 값의 더 작은 집합을 나타낸다. 일반적으로 제약 조건이 더 좁혀질 때마다 실행되어야 하는 썽크를 지정하는 방법이 있다. 이는 "제약 전파"를 지원하는 데 필요하다.

칼 휴이트는 두 가지 점에서 future가 promise보다 더 적합한 용어라고 주장한다. 첫째, promise(약속)는 반드시 미래 시점을 의미하지 않기 때문에 future(미래)보다 모호하다. 둘째, promise는 단순한 언어 표현이지만, future는 현물(actuals)에 대한 선물(futures)이라는 의미도 있다(즉, 실제 물건에 대한 대용품).

future라는 구문이 처음 소개된 것은 1977년 헨리 베이커(Henry Baker (computer scientist))와 칼 휴이트의 논문에서였다. 반면 promise라는 용어는 1976년 다니엘 P. 프리드먼(Daniel P. Friedman)과 데이비드 와이즈가 제안했고, 최종적으로 피터 히바드가 사용했다. future (promise)를 사용하면 분산 컴퓨팅 시스템에서 지연 시간을 획기적으로 줄일 수 있다. 예를 들어 액터 모델처럼 메시지 파이프라인화가 가능하며, 이를 '''promise pipelining'''이라고 부른다.

5. 1. 코루틴

퓨처는 코루틴[26] 또는 제너레이터[103]로 구현될 수 있으며, 동일한 평가 전략(예: 협동적 멀티태스킹 또는 지연 평가)을 사용한다.

5. 2. 채널

퓨처는 채널을 통해 쉽게 구현할 수 있다. 퓨처는 한 개의 요소가 있는 채널이며, 프라미스는 채널에 데이터를 보내 퓨처를 충족시키는 프로세스이다.[104][105] 이는 CSPGo와 같이 채널을 지원하는 동시성 프로그래밍 언어에서 퓨처를 구현할 수 있게 해준다. 결과적으로 생성된 퓨처는 명시적인데, 이는 평가만 하는 것이 아니라 채널에서 읽어와야 접근할 수 있기 때문이다.

참조

[1] 간행물 The Impact of Applicative Programming on Multiprocessing
[2] 간행물 Parallel Processing Facilities
[3] 간행물 The Incremental Garbage Collection of Processes http://home.pipeline[...] ACM SIGPLAN Notices 12, 8 1977-08
[4] 웹사이트 Promise Pipelining at erights.org http://www.erights.o[...]
[5] 웹사이트 Promise Pipelining on the C2 wiki http://c2.com/cgi/wi[...]
[6] 간행물 Promises: Linguistic Support for Efficient Asynchronous Procedure Calls in Distributed Systems ACM
[7] 간행물 Robust promises with Dojo deferred http://www.sitepen.c[...] Site Pen 2010-05-03
[8] 간행물 Alice Manual Uni-SB
[9] 간행물 Alice manual Uni-SB
[10] 간행물 Promise http://wiki.erights.[...] E rights
[11] 웹사이트 500 lines or less, "A Web Crawler With asyncio Coroutines" by A. Jesse Jiryu Davis and Guido van Rossum http://aosabook.org/[...]
[12] 간행물 Control Concurrent MVar http://www.haskell.o[...] Haskell
[13] 간행물 WaitNeeded http://www.mozart-oz[...] Mozart Oz
[14] 간행물 Promise http://www.sunless-s[...] Sunless Sea
[15] 간행물 Argus http://www.pmg.csail[...] MIT
[16] 간행물 Distributed computing and Argus http://www.ieeeghn.o[...] IEEE GHN 2021-01-26
[17] 간행물 Gold http://www.udanax.co[...] Udanax
[18] 간행물 Pipeline http://www.erights.o[...] E rights
[19] 논문 A Preview of Act 1 1981-06
[20] 논문 Thinking About Lots of Things at Once without Getting Confused: Parallelism in Act 1 1981-06
[21] 웹사이트 Concurrency in JDK 5.0 https://www.ibm.com/[...] 2004-11-23
[22] 웹사이트 Async in 4.5: Worth the Await – .NET Blog – Site Home – MSDN Blogs http://blogs.msdn.co[...] Blogs.msdn.com 2014-05-13
[23] 웹사이트 Asynchronous Programming with Async and Await (C# and Visual Basic) http://msdn.microsof[...] Msdn.microsoft.com 2014-05-13
[24] 웹사이트 Asynchronous C# and F# (I.): Simultaneous introduction http://tomasp.net/bl[...] 2010-10-29
[25] 웹사이트 The F# Asynchronous Programming Model, PADL 2011 http://blogs.msdn.co[...] 2010-10-21
[26] 웹사이트 PEP 0492 – Coroutines with async and await syntax https://www.python.o[...]
[27] 간행물 ABCL/f: A Future-Based Polymorphic Typed Concurrent Object-Oriented Language – Its Design and Implementation. American Mathematical Society
[28] 웹사이트 Dart SDK dart async Completer https://api.dartlang[...]
[29] 웹사이트 Dart Language Asynchrony Support: Phase 1 https://www.dartlang[...] 2014-10
[30] 웹사이트 Task http://package.elm-l[...]
[31] 웹사이트 Io, The Programming Language http://iolanguage.or[...]
[32] 웹사이트 Using promises https://developer.mo[...] Mozilla Developer Network 2021-02-23
[33] 웹사이트 Making asynchronous programming easier with async and await https://developer.mo[...] Mozilla Developer Network 2021-02-23
[34] 웹사이트 changes.txt at 1.1.x from richhickey's clojure https://github.com/r[...]
[35] 웹사이트 Future – Kotlin Programming Language https://kotlinlang.o[...]
[36] 웹사이트 Tutorial of Oz https://web.archive.[...] Mozart Global User Library 2011-04-12
[37] 웹사이트 Python 3.2 Release https://www.python.o[...]
[38] 웹사이트 Python 3.5 Release https://www.python.o[...]
[39] 웹사이트 Parallelism with Futures http://docs.racket-l[...] PLT 2012-03-02
[40] 웹사이트 class Promise https://docs.raku.or[...] raku.org 2022-08-19
[41] 웹사이트 Future in std::future - Rust https://doc.rust-lan[...] 2023-12-16
[42] 웹사이트 Common Lisp Blackbird https://orthecreeden[...]
[43] 웹사이트 Common Lisp Eager Future2 http://common-lisp.n[...]
[44] 웹사이트 Lisp in parallel – A parallel programming library for Common Lisp https://lparallel.or[...]
[45] 웹사이트 Common Lisp PCall http://marijnhaverbe[...]
[46] 웹사이트 Chapter 30. Thread 4.0.0 http://www.boost.org[...] 2013-06-26
[47] 웹사이트 Dlib C++ Library #thread_pool http://www.boost.org[...] 2013-06-26
[48] 웹사이트 GitHub – facebook/folly: An open-source C++ library developed and used at Facebook. https://github.com/f[...] 2019-01-08
[49] 웹사이트 HPX http://stellar-group[...] 2019-02-10
[50] 웹사이트 Threads Slides of POCO https://pocoproject.[...]
[51] 웹사이트 QtCore 5.0: QFuture Class https://web.archive.[...] Qt Project 2013-06-26
[52] 웹사이트 Seastar http://seastar-proje[...] Seastar project 2016-08-22
[53] 웹사이트 stlab is the ongoing work of what was Adobe's Software Technology Lab. The Adobe Source Libraries (ASL), Platform Libraries, and new stlab libraries are hosted on github. https://stlab.cc/lib[...] 2021-01-31
[54] 웹사이트 Groovy GPars http://gpars.codehau[...]
[55] 웹사이트 Cujo.js http://cujojs.com
[56] 웹사이트 JavaScript when.js https://github.com/c[...]
[57] 웹사이트 Promises/A+ specification http://promisesaplus[...]
[58] 웹사이트 promises http://dojotoolkit.o[...]
[59] 웹사이트 JavaScript MochKit.Async https://mochi.github[...]
[60] 웹사이트 JavaScript Angularjs https://angularjs.or[...]
[61] 웹사이트 JavaScript node-promise https://github.com/k[...]
[62] 웹사이트 JavaScript Q https://web.archive.[...] 2013-04-08
[63] 웹사이트 JavaScript RSVP.js https://github.com/t[...]
[64] 웹사이트 YUI JavaScript class library http://yuilibrary.co[...]
[65] 웹사이트 YUI JavaScript promise class http://yuilibrary.co[...]
[66] 웹사이트 JavaScript Bluebird https://github.com/p[...]
[67] 웹사이트 Java JDeferred http://jdeferred.org
[68] 웹사이트 Java ParSeq https://github.com/l[...]
[69] 웹사이트 Objective-C MAFuture GitHub https://github.com/m[...]
[70] 웹사이트 Objective-C MAFuture mikeash.com http://www.mikeash.c[...]
[71] Github Objective-C RXPromise https://github.com/c[...]
[72] Github ObjC-CollapsingFutures https://github.com/S[...]
[73] 웹사이트 Objective-C PromiseKit http://promisekit.or[...]
[74] Github Objective-C objc-promise https://github.com/m[...]
[75] Github Objective-C OAPromise https://github.com/o[...]
[76] 문서 OCaml Lazy http://caml.inria.fr[...]
[77] 문서 Perl Future http://metacpan.org/[...]
[78] 문서 Perl Promises https://metacpan.org[...]
[79] 문서 Perl Reflex http://metacpan.org/[...]
[80] 문서 Perl Promise::ES6 http://metacpan.org/[...]
[81] 웹사이트 Promise::XS – Fast promises in Perl – metacpan.org https://metacpan.org[...] 2021-02-14
[82] Github PHP React/Promise https://github.com/r[...]
[83] 문서 Python built-in implementation https://docs.python.[...]
[84] 웹사이트 pythonfutures http://code.google.c[...]
[85] 웹사이트 Twisted Deferreds https://web.archive.[...] 2010-04-29
[86] 문서 R package future https://cran.r-proje[...]
[87] 문서 future https://cran.r-proje[...]
[88] Github Concurrent Ruby https://github.com/r[...]
[89] 웹사이트 Ruby Promise gem http://rubygems.org/[...]
[90] Github Ruby libuv https://github.com/c[...]
[91] 웹사이트 Ruby Celluloid gem https://web.archive.[...] 2022-02-19
[92] Github Ruby future-resource https://github.com/a[...]
[93] Github futures-rs crate https://github.com/a[...]
[94] 웹사이트 Twitter's util library https://twitter.gith[...]
[95] 웹사이트 Swift Async https://web.archive.[...] 2014-06-23
[96] Github Swift FutureKit https://github.com/F[...]
[97] 웹사이트 Swift Apple GCD https://developer.ap[...]
[98] Github Swift FutureLib https://github.com/c[...]
[99] Github bignerdranch/Deferred https://github.com/b[...]
[100] Github Thomvis/BrightFutures https://github.com/T[...]
[101] Github belozierov/SwiftCoroutine https://github.com/b[...]
[102] 웹사이트 tcl-promise https://sourceforge.[...]
[103] 웹사이트 Does async/await solve a real problem? https://esdiscuss.or[...]
[104] 웹사이트 Go language patterns Futures https://web.archive.[...] 2014-02-09
[105] 웹사이트 Go Language Patterns https://web.archive.[...] 2014-02-09
[106] 콘퍼런스 ABCL/f: A Future-Based Polymorphic Typed Concurrent Object-Oriented Language -- Its Design and Implementation. http://citeseerx.ist[...] American Mathematical Society
[107] 웹사이트 Future class - dart:async library - Dart API https://api.flutter.[...] 2021-06-17
[108] 웹사이트 Completer class - dart:async library - Dart API https://api.dart.dev[...] 2021-06-17
[109] 웹사이트 Asynchronous programming: futures, async, await | Dart https://dart.dev/cod[...] 2021-06-17
[110] 웹사이트 Io, The Programming Language http://iolanguage.co[...] 2008-05-05
[111] 웹사이트 changes.txt at 1.1.x from richhickey's clojure https://github.com/r[...] 2013-04-14
[112] 웹사이트 Tutorial of Oz http://www.mozart-oz[...] MOzart Global User Library 2011-04-12
[113] 웹사이트 Parallelism with Futures http://docs.racket-l[...] PLT 2012-03-02
[114] 웹사이트 asyncfutures https://nim-lang.org[...] 2021-06-12
[115] Boost Boost.Future https://www.boost.or[...]
[116] Boost Boost.Promise https://www.boost.or[...]
[117] Microsoft Docs Task Parallelism (Concurrency Runtime) | Microsoft Docs https://docs.microso[...]
[118] 콘퍼런스인용 The Impact of Applicative Programming on Multiprocessing
[119] 콘퍼런스인용 Parallel Processing Facilities
[120] 콘퍼런스인용 The Incremental Garbage Collection of Processes http://home.pipeline[...] ACM SIGPLAN Notices 12, 8 1977-08
[121] SIP SIP-14 – Futures and Promises http://docs.scala-la[...]
[122] 콘퍼런스인용 ABCL/f: A Future-Based Polymorphic Typed Concurrent Object-Oriented Language – Its Design and Implementation. American Mathematical Society
[123] 웹인용 Dart SDK dart async Completer https://api.dartlang[...]
[124] 웹인용 Dart Language Asynchrony Support: Phase 1 https://www.dartlang[...] 2014-10
[125] 웹인용 Task http://package.elm-l[...]
[126] 웹인용 Io, The Programming Language http://iolanguage.or[...]
[127] 웹인용 changes.txt at 1.1.x from richhickey's clojure https://github.com/r[...]
[128] 웹인용 Async in 4.5: Worth the Await – .NET Blog – Site Home – MSDN Blogs http://blogs.msdn.co[...] Blogs.msdn.com 2014-05-13
[129] 웹인용 Asynchronous Programming with Async and Await (C# and Visual Basic) http://msdn.microsof[...] Msdn.microsoft.com 2014-05-13
[130] 웹인용 Tutorial of Oz http://www.mozart-oz[...] Mozart Global User Library 2011-04-12
[131] Python Release Python 3.2 Release https://www.python.o[...]
[132] Python Release Python 3.5 Release https://www.python.o[...]
[133] 웹인용 Parallelism with Futures http://docs.racket-l[...] PLT 2012-03-02
[134] Perl 6 Promise class in Perl 6 https://docs.perl6.o[...]
[135] Common Lisp Common Lisp Blackbird https://orthecreeden[...]
[136] Common Lisp Common Lisp Eager Future2 http://common-lisp.n[...]
[137] Lisp Lisp in parallel – A parallel programming library for Common Lisp https://lparallel.or[...]
[138] Common Lisp Common Lisp PCall http://marijnhaverbe[...]
[139] 웹인용 Chapter 30. Thread 4.0.0 http://www.boost.org[...] 2013-06-26
[140] 웹인용 Dlib C++ Library #thread_pool http://www.boost.org[...] 2013-06-26
[141] 웹인용 QtCore 5.0: QFuture Class https://web.archive.[...] Qt Project 2013-06-26
[142] 웹인용 Seastar http://seastar-proje[...] Seastar project 2016-08-22
[143] 웹인용 GitHub – facebook/folly: An open-source C++ library developed and used at Facebook. https://github.com/f[...] 2019-01-08
[144] 웹인용 Threads Slides of POCO https://pocoproject.[...]
[145] 웹인용 HPX http://stellar-group[...] 2019-02-10
[146] 웹사이트 Groovy GPars http://gpars.codehau[...]
[147] 웹인용 Cujo.js http://cujojs.com/ 2021-06-12
[148] 문서 JavaScript when.js https://github.com/c[...]
[149] 문서 Promises/A+ specification http://promisesaplus[...]
[150] 문서 promises http://dojotoolkit.o[...]
[151] 문서 JavaScript MochKit.Async https://mochi.github[...]
[152] 문서 JavaScript Angularjs https://angularjs.or[...]
[153] 문서 JavaScript node-promise https://github.com/k[...]
[154] 웹인용 JavaScript Q http://documentup.co[...] 2020-08-13
[155] 문서 JavaScript RSVP.js https://github.com/t[...]
[156] 문서 YUI JavaScript class library http://yuilibrary.co[...]
[157] 문서 YUI JavaScript promise class http://yuilibrary.co[...]
[158] 문서 JavaScript Bluebird https://github.com/p[...]
[159] 문서 Java JDeferred http://jdeferred.org
[160] 문서 Java ParSeq https://github.com/l[...]
[161] 문서 Objective-C MAFuture GitHub https://github.com/m[...]
[162] 문서 Objective-C MAFuture mikeash.com http://www.mikeash.c[...]
[163] 문서 Objective-C RXPromise https://github.com/c[...]
[164] 문서 ObjC-CollapsingFutures https://github.com/S[...]
[165] 문서 Objective-C PromiseKit http://promisekit.or[...]
[166] 문서 Objective-C objc-promise https://github.com/m[...]
[167] 문서 Objective-C OAPromise https://github.com/o[...]
[168] 문서 OCaml Lazy http://caml.inria.fr[...]
[169] 문서 Perl Future http://metacpan.org/[...]
[170] 문서 Perl Promises https://metacpan.org[...]
[171] 문서 Perl Reflex http://metacpan.org/[...]
[172] 문서 Perl Promise::ES6 http://metacpan.org/[...]
[173] 문서 PHP React/Promise https://github.com/r[...]
[174] 문서 Python built-in implementation https://docs.python.[...]
[175] 문서 pythonfutures http://code.google.c[...]
[176] 웹인용 Twisted Deferreds http://twistedmatrix[...] 2020-08-13
[177] R package R package future https://cran.r-proje[...]
[178] 간행물 future https://cran.r-proje[...]
[179] Ruby gem Ruby Promise gem http://rubygems.org/[...]
[180] Ruby Ruby libuv https://github.com/c[...]
[181] 웹인용 Ruby Celluloid gem http://celluloid.io/ 2021-03-15
[182] Ruby Ruby future-resource https://github.com/a[...]
[183] crate futures-rs crate https://github.com/a[...]
[184] 라이브러리 Twitter's util library https://twitter.gith[...]
[185] 웹인용 Swift Async https://web.archive.[...] 2020-08-13
[186] Swift Swift FutureKit https://github.com/F[...]
[187] GCD Swift Apple GCD https://developer.ap[...]
[188] Swift Swift FutureLib https://github.com/c[...]
[189] Github bignerdranch/Deferred https://github.com/b[...]
[190] Github Thomvis/BrightFutures https://github.com/T[...]
[191] 프로젝트 tcl-promise https://sourceforge.[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com