2008-09-17 15 views
14

Was sind Futures? Es hat etwas mit fauler Bewertung zu tun.Was sind Futures?

+0

Futures sind nicht unbedingt mit Lazy Evaluation zu tun. In der Tat sind Lazy Futures für viele Anwendungsfälle genau das, was Sie nicht brauchen: IO, Networking, etc ... – brice

+0

"Futures" bekommen derzeit viel Aufmerksamkeit durch JavaScript! Aber die Terminologie im JavaScript-Bereich ist "aufgeschoben" und "Versprechen". – hippietrail

Antwort

3

Ein Future kapselt eine verzögerte Berechnung ein und wird häufig verwendet, um eine faule Bewertung in eine nicht-faule Sprache zu verwandeln. Wenn eine Zukunft zum ersten Mal bewertet wird, wird der für die Auswertung erforderliche Code ausgeführt, und die Zukunft wird durch das Ergebnis ersetzt.

Da die Zukunft ersetzt wird, führen nachfolgende Evaluierungen den Code nicht erneut aus und liefern einfach das Ergebnis.

7

Wenn Sie eine Zukunft erstellen, wird ein neuer Hintergrundthread gestartet, der mit der Berechnung des realen Werts beginnt. Wenn Sie den Wert der Zukunft anfordern, wird er blockiert, bis der Thread die Berechnung beendet hat. Dies ist sehr nützlich, wenn Sie einige Werte parallel generieren müssen und nicht manuell nachverfolgen möchten.

Siehe lazy.rb für Ruby oder Scala, futures, and lazy evaluation.

Sie können wahrscheinlich in jeder Sprache mit Threads implementiert werden, obwohl es offensichtlich in einer Low-Level-Sprache wie C schwieriger als in einer höheren funktionalen Sprache wäre.

+0

AFAIK, beginnen Futures nicht ausgeführt, bis sie tatsächlich angefordert werden. Futures werden oft verwendet, um eine Lazy Barrier, z.B. um eine unendliche Struktur zu implementieren. Wenn Futures unmittelbar nach ihrer Erstellung ausgeführt würden, wären sie dafür nicht geeignet. – 0124816

+1

@ 012 ...: Überprüfen Sie die Links, die ich gepostet habe, sie geben einen guten Überblick über Futures. –

+2

http://en.wikipedia.org/wiki/Futures_and_promises#Distinction_between_futures_and_promises Scheint eine endgültige Referenz zu sein. (Hah! Wikipedia!) Zusammenfassung: Futures wurden nicht gleichzeitig ausgeführt. jetzt definieren einige sie so und haben das ursprüngliche Konzept in ein Versprechen umbenannt. – 0124816

9

Es gibt eine Wikipedia article über Futures. Kurz gesagt, es ist eine Möglichkeit, einen Wert zu verwenden, der noch nicht bekannt ist. Der Wert kann dann bei Bedarf (Lazy Evaluation) und optional gleichzeitig mit der Hauptberechnung berechnet werden.

C++ Beispiel folgt.


Angenommen, Sie möchten die Summe zweier Zahlen berechnen. Sie können entweder die typische eifrige Umsetzung:

int add(int i, int j) { return i + j; } 
// first calculate both Nth_prime results then pass them to add 
int sum = add(Nth_prime(4), Nth_prime(2)); 

oder können Sie die Futures Art und Weise verwenden, die unter Verwendung von C++ 11 std::async, die ein std::future zurückgibt. In diesem Fall wird die add-Funktion nur blockieren, wenn sie versucht, einen Wert zu verwenden, der noch nicht berechnet wurde (man kann auch eine rein faule Alternative erstellen).

int add(future<int> i, future<int> j) { return i.get() + j.get(); } 
int sum = add(async(launch::async, [](){ return Nth_prime(4); }), 
       async(launch::async, [](){ return Nth_prime(2); })); 
6

Jeder erwähnt Futures für den Zweck der faulen Berechnung. Eine andere Verwendung, die nicht der Werbung entspricht, ist die Verwendung von Futures für IO im Allgemeinen. Besonders nützlich sind sie zum Laden von Dateien und zum Warten auf Netzwerkdaten.

0

The Wiki Article gibt einen guten Überblick über Futures. Das Konzept wird im Allgemeinen in gleichzeitigen Systemen verwendet, um Berechnungen über Werte zu planen, die möglicherweise noch nicht berechnet wurden und deren Berechnung möglicherweise noch nicht abgeschlossen ist.

Aus dem Artikel:

Eine Zukunft mit einem bestimmten Thread zugeordnet ist, dessen Wert berechnet. Diese Berechnung kann entweder begierig gestartet werden, wenn die Zukunft erstellt wird, oder faul, wenn ihr Wert zuerst benötigt wird.

im Artikel nicht erwähnt, sind Futures ein Monad, und so ist es möglich, Funktionen auf zukünftige Werte in die Monade projizieren sie auf den zukünftigen Wert angewendet zu haben, wenn sie verfügbar sind, eine andere Zukunft ergeben, die wiederum repräsentiert das Ergebnis dieser Funktion.

0

Futures werden auch in bestimmten Entwurfsmustern verwendet, insbesondere für Echtzeitmuster, z. B. das ActiveObject-Muster, das den Methodenaufruf von der Methodenausführung trennt. Die Zukunft ist eingerichtet, auf die vollendete Ausführung zu warten. Ich neige dazu, es zu sehen, wenn Sie aus einer Multithreadumgebung wechseln müssen, um mit einer einzelnen Threaded-Umgebung zu kommunizieren. Es kann Fälle geben, in denen ein Stück Hardware keine Kernel-Unterstützung für Threading bietet und in diesem Fall Futures verwendet werden. Auf den ersten Blick ist es nicht offensichtlich, wie Sie kommunizieren würden, und überraschenderweise machen Futures es ziemlich einfach. Ich habe ein bisschen C# -Code. Ich werde es ausgraben und posten.

0

gibt eine sehr gründliche Erklärung zusammen mit einem Beispiel, wie Sie eine Zukunft selbst implementieren könnten. Ich empfehle es wirklich :)

+0

Link funktioniert nicht mehr - Warnung: Erstellen eines Standardobjekts aus leerem Wert ... – mrwaim