Czym różnią się futures i obietnice Clojure?

Zarówno Kontrakty terminowe, jak i obietnice blokują się, dopóki nie obliczą swoich wartości, więc jaka jest różnica między nimi?

Author: hippietrail, 2011-01-07

4 answers

Odpowiadając w kategoriach Clojure, oto kilka przykładów z screencast Seana Devlina:

(def a-promise (promise))
(deliver a-promise :fred)

(def f (future (some-sexp)))
(deref f)

Zauważ, że w obietnicy jawnie dostarczasz wartość, którą wybierzesz w późniejszym obliczeniu (:fred w tym przypadku). Z drugiej strony przyszłość jest konsumowana w tym samym miejscu, w którym została stworzona. some-expr jest prawdopodobnie uruchomiony za kulisami i obliczany w tandemie (ostatecznie), ale jeśli pozostanie bez oceny do czasu uzyskania dostępu do bloków wątku dopóki nie będzie dostępna.


edited to add

Aby pomóc w dalszym rozróżnieniu między obietnicą a przyszłością, zauważ, co następuje:

Obietnica

  1. tworzysz promise. Ten obiekt obietnicy może być teraz przekazany do dowolnego wątku.
  2. Kontynuuj obliczenia. Mogą to być bardzo skomplikowane obliczenia obejmujące efekty uboczne, pobieranie danych, wprowadzanie danych przez użytkownika, dostęp do bazy danych, inne obietnice-cokolwiek zechcesz. Kod będzie wygląd bardzo podobny do kodu głównego w każdym programie.
  3. kiedy skończysz, możesz deliver uzyskać wyniki tego obiektu obietnicy.
  4. każdy element, który spróbuje deref Twojej obietnicy przed zakończeniem obliczeń, zablokuje się do końca. Kiedy skończycie i dotrzymacie obietnicy, obietnica nie będzie dłużej blokować.

Przyszłość

    Tworzysz swoją przyszłość. Część twojej przyszłości jest wyrażeniem do obliczeń.
  1. The future może, ale nie musi, wykonywać jednocześnie. Może być przypisany wątek, ewentualnie z basenu. To może poczekać i nic nie zrobić. Z twojej perspektywy nie możesz powiedzieć.
  2. w pewnym momencie ty (lub inny wątek) deref jesteś przyszłością. Jeśli obliczenia zostały już zakończone, otrzymasz wyniki. Jeśli nie został jeszcze ukończony, blokujesz go, dopóki nie został ukończony. (Przypuszczalnie, jeśli jeszcze się nie rozpoczął, derefing oznacza to, że zaczyna działać, ale to również nie jest gwarantuję.)

Chociaż tymógłbyś sprawić, że wyrażenie w przyszłości będzie tak skomplikowane, jak kod, który następuje po stworzeniu obietnicy, wątpliwe jest, że jest to pożądane. Oznacza to, że kontrakty futures są naprawdę bardziej odpowiednie do szybkich obliczeń w tle, podczas gdy obietnice są naprawdę bardziej odpowiednie do dużych, skomplikowanych ścieżek realizacji. Również obietnice wydają się, jeśli chodzi o dostępne obliczenia, nieco bardziej elastyczne i zorientowane na twórcę obietnicy wykonującego dzieło i kolejny wątek zbierający żniwo. Futures są bardziej zorientowane na automatyczne uruchamianie wątku (bez brzydkich i podatnych na błędy napowietrznych) i kontynuowanie innych rzeczy, dopóki ty-wątek początkowy-nie potrzebujesz wyników.

 48
Author: JUST MY correct OPINION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-07 14:16:32

Zarówno przyszłość, jak i obietnica są mechanizmami przekazywania wyników obliczeń asynchronicznych od producenta do konsumenta (- ów).

W przypadku przyszłości obliczenia są definiowane w momencie tworzenia przyszłości i asynchroniczne wykonywanie rozpoczyna się "ASAP". "Wie" również, jak wywołać obliczenia asynchroniczne.

W przypadku obietnicy obliczenia , jegoczas rozpoczęcia i[możliwe] asynchroniczne wywołanie są oddzielone od mechanizm dostawy. Gdy obliczenia wynik jest dostępny, producent musi jawnie wywołać deliver, co również oznacza, że producent kontroluje , Gdy wynik staje się dostępny.

Dlaobietnic Clojure popełnia błąd projektowy, używając tego samego obiektu (wynik wywołaniapromise) zarówno produce (deliver), jak i consumption (deref) wynik obliczeń . Są to dwie bardzo różne możliwości i powinny być traktowane jako takie.

 22
Author: dimagog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-31 18:19:40

Są już doskonałe odpowiedzi, więc wystarczy dodać podsumowanie "jak korzystać":

Obie

Tworzenie obietnicy lub przyszłości natychmiast zwraca odniesienie. Ta Referencja blokuje @ / deref dopóki wynik obliczeń nie zostanie dostarczony przez inny wątek.

Future

Podczas tworzenia przyszłości zapewniasz synchroniczne zadanie do wykonania. Jest wykonywany w wątku z dedykowanego puli nieograniczonej.

Promise

Nie podajesz argumentów podczas tworzenia obietnicy. Odniesienie powinno zostać przekazane do innego wątku 'user', który będzie deliver wynikiem.

 2
Author: Grzegorz Luczywo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 11:22:54

Po pierwsze, a Promise jest Future. Myślę, że chcesz poznać różnicę między Promise a FutureTask.

A Future reprezentuje wartość, która nie jest obecnie znana, ale będzie znana w przyszłości.

A FutureTask reprezentuje wynik obliczeń, które będą miały miejsce w przyszłości (może w jakiejś puli wątków). Gdy próbujesz uzyskać dostęp do wyniku, jeśli obliczenia jeszcze się nie odbyły, blokuje się. W przeciwnym razie wynik jest zwracany natychmiast. Nie ma innej strony zaangażowanej w obliczanie wyniku obliczenia jest określone przez Ciebie z góry.

A Promise reprezentuje wynik, który zostanie dostarczony przez promisera do promisee w przyszłości. W tym przypadku jesteś obiecującym, a promiserem jest ten, który dał ci obiekt Promise. Podobnie jak w przypadku FutureTask, jeśli spróbujesz uzyskać dostęp do wyniku przed spełnieniem Promise, zostanie on zablokowany, dopóki promiser nie spełni Promise. Po wypełnieniu Promise, otrzymujesz tę samą wartość zawsze i natychmiast. W przeciwieństwie do FutureTask, jest tu zaangażowana inna strona, która stworzyła Promise. Że inna strona jest odpowiedzialna za wykonanie obliczeń i wypełnienie Promise.

W tym sensie FutureTask jest Promise stworzonym dla siebie.

 -4
Author: Abhinav Sarkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-29 14:03:21