Movatterモバイル変換


[0]ホーム

URL:


Zum Inhalt springen
WikipediaDie freie Enzyklopädie
Suche

Future (Programmierung)

aus Wikipedia, der freien Enzyklopädie

EinFuture (engl. ‚Zukunft‘) oder einPromise (engl. ‚Versprechen‘) bezeichnet in derProgrammierung einen Platzhalter (Proxy) für ein Ergebnis, das noch nicht bekannt ist, meist weil seine Berechnung noch nicht abgeschlossen ist.

Ein Future ist meist das Ergebnis einesasynchronen Aufrufs einer Funktion oder einer Methode und kann verwendet werden, um auf das Ergebnis zuzugreifen, sobald es verfügbar ist. Diese Art der Programmierung erlaubt eine weitgehend transparenteParallelisierungnebenläufigerProzesse. Das Konzept der Futures wurde 1977 in einem Artikel vonHenry G. Baker undCarl Hewitt vorgestellt.

Eine zentrale Idee der Programmierung mit Futures ist, dass Futures als Argumente an andere Prozeduraufrufe weitergereicht werden können. Die Auswertung dieses Aufrufs kann dann schon beginnen, bevor das Ergebnis des Futures selbst verfügbar ist. Das erlaubt ein maximales Maß an Parallelismus. Erfolgt der neue Aufruf wiederum asynchron, so spricht man auch vonPipelining der Futures. Pipelining kann insbesondere in verteilten Anwendungen benutzt werden, um die Latenzzeiten vonInterprozesskommunikation zu minimieren.

Funktion

[Bearbeiten |Quelltext bearbeiten]

Futures sind ein Konstrukt zur asynchronenInterprozesskommunikation. Konzeptionell bietet ein Future eineget- oderjoin-Funktion, die so lange blockiert, bis das Ergebnis vorliegt, und dieses dann zurückliefert. Je nach Implementierung kann die Wartezeit mittelsTimeout beschränkt werden oder durch zusätzliche Funktionen eine Abfrage des aktuellen Status erfolgen.

Sind Futures direkt in dieProgrammiersprache integriert, so ist häufig nur einasynchronerZuweisungsoperator definiert, zum Beispielx @=Ausdruck inFlow Java, einer anJava angelehnten experimentellen Programmiersprache. Dies bedeutet: Starte einen Prozess zum Berechnen des Ausdrucks, der rechts des Operators steht, und weise der Variablex ein Future für das Ergebnis zu. Wird danach auf die Variablex zugegriffen, so wird an dieser Stelle so lange gewartet, bis das Ergebnis vorliegt.

Programmiersprachen undProgrammbibliotheken, dieFutures oderPromises unterstützen sindCORBA (mitAsynchronous Method Invocation (AMI)), und – ab Version 5 –Java mittelsConcurrency Utilities, einer Klassenbibliothek für Nebenläufigkeit.JavaScript stellt diese Konstrukte seitECMAScript 6 bereit (wenngleich derzeit noch in eingeschränkter Form.)[1]Rust stellt ebenfallsFutures zur Verfügung. Auch fürC++ stehen verschiedene Bibliotheken zur Verfügung, die wohl bekannteste von ihnen istBoost. Im StandardC++11 sind Nebenläufigkeit und Futures ebenfalls in derStandardbibliothek verfügbar. Weitere Programmiersprachen mit Unterstützung fürFutures undPromises sindIo,Oz,Scheme,Smalltalk undScala.

InC# 5.0 undVisual Basic 2013 werden Futures über async und await implizit verwendet.[2] Eine entsprechende Future-Klasse ist hierbei in denParallel Extensions definiert und kann somit auch in älteren Versionen und anderen Programmiersprachen verwendet werden. Eine solche kann bei Bedarf allerdings auch selbst implementiert werden.[3][4][5]

Aufbau

[Bearbeiten |Quelltext bearbeiten]

Ein Future ist eineMonade mit einem zugehörigenResolver, welcher dem Future einen Wert zuweist. Das Future kann sich in einem von drei Zuständen befinden:

  • erfüllt (englisch:promise kept)
  • gebrochen (englisch:promise broken)
  • wartend (englisch:promise pending)

Wenn der Wert vom Resolver zugewiesen und damit bekannt ist, generiert das Future einEreignis für welcheRückruffunktionen registriert werden.

Beispiel

[Bearbeiten |Quelltext bearbeiten]

Der folgendePseudocode zeigt die Verwendung von Futures mittels des asynchronen Zuweisungsoperators@=.

var x @= berechneX();// Beginne Berechnung von xvar y @= berechneY();// Beginne Berechnung von y
var z = berechneZ();// Vollständige Berechnung von z
var ergebnis= x + y + z;// Benutze x, y und z.// Hier muss dann eventuell auf die Berechnung// von x und y gewartet werden.

Daraus ergibt sich folgende Parallelisierung:

Haupt-ThreadX-ThreadY-Thread
starte berechneX()  
starte berechneY()berechneX()
berechneZ()berechneY()
warte auf x und y
 
berechne ergebnis 

Die Aufteilung der Berechnung auf mehrereThreads kann Berechnungen deutlich beschleunigen, wenn mehrereHauptprozessoren (oderProzessorkerne) zur Verfügung stehen, oder wenn die einzelnen Berechnungen den Hauptprozessor nicht auslasten, weil sie etwa viel Zeit mit dem Warten aufPeripheriegeräte verbringen.

Literatur

[Bearbeiten |Quelltext bearbeiten]
  • Henry G. Baker and Carl Hewitt:The Incremental Garbage Collection of Processes. Proceeding of the Symposium on Artificial Intelligence Programming Languages. SIGPLAN Notices 12. August 1977.
  • Henry Lieberman:Thinking About Lots of Things at Once without Getting Confused: Parallelism in Act 1. MIT AI memo 626. Mai 1981.
  • Henry Lieberman:A Preview of Act 1. MIT AI memo 625. Juni 1981.

Weblinks

[Bearbeiten |Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. Promise. In: MDN. Mozilla Foundation, abgerufen am 31. Oktober 2014 (englisch). 
  2. Asynchronous programming (Windows Store apps). In: MSDN. Microsoft, abgerufen am 22. Februar 2014 (englisch). 
  3. Futures. In: MSDN, Parallel Programming with Microsoft .NET. Microsoft, abgerufen am 22. Februar 2014 (englisch). 
  4. Dan Vanderboom: Concurrency & Coordination With Futures in C#. In: Critical Development. 3. Juli 2008, abgerufen am 22. Februar 2014 (englisch). 
  5. Matt Kotsenas at. al.: C# Promises. In: BitBucket. Abgerufen am 23. Februar 2014 (englisch). 
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Future_(Programmierung)&oldid=253956707
Kategorien:

[8]ページ先頭

©2009-2025 Movatter.jp