Futures und Versprechen

Im Informatik, Zukunft, versprechen, Verzögerung, und aufgeschoben Siehe Konstrukte für verwendet für Synchronisierung Programm Hinrichtung in einigen Gleichzeitige Programmiersprachen. Sie beschreiben ein Objekt, das als Stellvertreter für ein zunächst unbekanntes Ergebnis wirkt, normalerweise weil die Berechnung von seinem Wert ist noch nicht vollständig.

Der Begriff versprechen wurde 1976 von vorgeschlagen von Daniel P. Friedman und David weise,[1] Und Peter Hibbard nannte es eventuell.[2] Ein etwas ähnliches Konzept Zukunft wurde 1977 in einem Papier von vorgestellt von Henry Baker und Carl Hewitt.[3]

Die Begriffe Zukunft, versprechen, Verzögerung, und aufgeschoben werden oft austauschbar verwendet, obwohl einige Unterschiede in der Nutzung zwischen Zukunft und versprechen werden unten behandelt. Insbesondere, wenn die Verwendung unterschieden wird, ist eine Zukunft a schreibgeschützt Platzhalteransicht einer Variablen, während ein Versprechen ein beschreibbares ist, ist einzelne Zuordnung Container, der den Wert der Zukunft festlegt. Insbesondere kann eine Zukunft definiert werden, ohne anzugeben, welches spezifische Versprechen ihren Wert festlegen wird, und unterschiedliche mögliche Versprechen können den Wert einer bestimmten Zukunft festlegen, obwohl dies nur einmal für eine bestimmte Zukunft erfolgen kann. In anderen Fällen werden eine Zukunft und ein Versprechen zusammen geschaffen und miteinander verbunden: Die Zukunft ist der Wert, das Versprechen ist die Funktion, die den Wert festlegt - im Wesentlichen den Rückgabewert (Zukunft) einer asynchronen Funktion (Versprechen). Das Festlegen des Wertes einer Zukunft wird ebenfalls genannt Lösung, erfüllend, oder Bindung es.

Anwendungen

Futures und Versprechen stammten von Funktionelle Programmierung und verwandte Paradigmen (wie z. Logikprogrammierung), um einen Wert (eine Zukunft) von der Berechnung (ein Versprechen) zu entkoppeln, sodass die Berechnung flexibler durchgeführt werden kann, insbesondere durch Parallelisierung. Später fand es verwendet in verteiltes Computer, bei der Reduzierung der Latenz von Kommunikationsrundreisen. Später nutzte es mehr, indem es das Schreiben asynchroner Programme in erlaubte direkter Stileher als in Fortsetzungsstil.

Implizit gegen explizit

Die Verwendung von Futures kann sein implizit (Jede Verwendung der Zukunft erhält automatisch ihren Wert, als wäre sie gewöhnlich Hinweis) oder explizit (Der Benutzer muss eine Funktion aufrufen, um den Wert zu erhalten, wie z. erhalten Methode von java.util.concurrent.futurein Java). Das Erhalten des Wertes einer expliziten Zukunft kann genannt werden stechen oder zwingen. Explizite Futures können als Bibliothek implementiert werden, während implizite Futures normalerweise als Teil der Sprache implementiert werden.

Das ursprüngliche Bäcker- und Hewitt -Papier beschrieben implizite Futures, die natürlich in der unterstützt werden Schauspielermodell von Berechnung und rein Objekt orientierte Programmierung Sprachen mögen Smalltalk. Das Friedman und das weise Papier beschrieben nur explizite Futures, was wahrscheinlich die Schwierigkeit widerspiegelt, implizite Zukunftsbetreuung auf Lagerhardware effizient implementiert zu werden. Die Schwierigkeit besteht darin, dass Aktienhardware nicht mit Futures für primitive Datentypen wie Ganzzahlen verfügt. Zum Beispiel weiß eine Add -Anweisung nicht, wie man umgeht 3 + zukünftige Fakultäten (100000). In reinen Schauspieler oder Objektsprachen kann dieses Problem durch Senden gelöst werden zukünftige Fakultäten (100000) die Nachricht +[3], was die Zukunft auffordert, hinzuzufügen 3 zu sich selbst und zurückgeben das Ergebnis. Beachten Sie, dass der Ansatz des Nachrichtenübergangs unabhängig von wann funktioniert Fakultät (100000) beendet die Berechnung und es ist kein Stecher/Erzwingen erforderlich.

Versprechen Sie Pipelining

Die Verwendung von Futures kann sich dramatisch verringern Latenz in verteilte Systeme. Zum Beispiel ermöglichen Futures Versprechen Sie Pipelining,[4][5] wie in den Sprachen implementiert E und Joule, was auch genannt wurde Rufstream[6] in der Sprache Argus.

Betrachten Sie einen Ausdruck, der konventionell ist Remote -Verfahrensanrufe, wie zum Beispiel:

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

das könnte erweitert werden auf

 t1: = x.a (); t2: = y.b (); t3: = t1.c (t2);

Jede Anweisung muss eine Nachricht gesendet werden, und eine Antwort, die vor der nächsten Anweisung erhalten wird. Nehmen wir zum Beispiel das an, das x, y, t1, und t2 befinden sich alle auf derselben Fernmaschine. In diesem Fall müssen zwei vollständige Netzwerk-Roundtrips zu diesem Computer stattfinden, bevor die dritte Anweisung ausgeführt werden kann. Die dritte Aussage führt dann zu einem weiteren Hindernis für die gleiche Fernmaschine.

Mit Futures könnte der obige Ausdruck geschrieben werden

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

das könnte erweitert werden auf

 T1: = x <- a (); T2: = y <- b (); T3: = T1 <- C (T2);

Die hier verwendete Syntax ist die der Sprache e, wo x <- a () bedeutet, die Nachricht zu senden a() asynchron zu x. Alle drei Variablen werden für ihre Ergebnisse sofort zugewiesen, und die Ausführung geht nach nachfolgenden Aussagen. Spätere Versuche, den Wert von zu lösen T3 kann eine Verzögerung verursachen; Pipelining kann jedoch die Anzahl der erforderlichen Hin- und Rückfahrten verringern. Wenn, wie im vorherigen Beispiel, x, y, t1, und t2 befinden sich alle auf derselben Fernmaschine, eine Pipelined -Implementierung kann berechnet werden T3 mit einem Hin- und Rückflug statt von drei. Da alle drei Nachrichten für Objekte bestimmt sind, die sich auf derselben Remote -Maschine befinden, muss nur eine Anforderung gesendet werden und nur eine Antwort benötigt, die das Ergebnis enthält. Der Send T1 <- C (T2) würde nicht blockieren, selbst wenn t1 und t2 waren auf verschiedenen Maschinen zueinander oder zu x oder y.

Das Versprechen -Pipelining sollte von einer parallelen asynchronen Botschaft unterschieden werden. In einem System, das eine parallele Nachricht unterstützt, aber nicht pipelining, sendet die Nachricht x <- a () und y <- b () im obigen Beispiel konnte parallel fortgesetzt, aber der Senden von von T1 <- C (T2) müsste bis beides warten t1 und t2 war empfangen worden, auch wenn x, y, t1, und t2 sind auf derselben Fernmaschine. Der relative Latenzvorteil der Pipelinierung wird in komplizierteren Situationen mit vielen Nachrichten noch größer.

Das Versprechen von Pipelining sollte auch nicht verwechselt werden Pipeline -Nachrichtenverarbeitung In Akteursystemen, wo es einem Akteur möglich ist, ein Verhalten für die nächste Nachricht auszuführen und zu beginnen, bevor die Verarbeitung der aktuellen Nachricht abgeschlossen ist.

Schreibgeschützte Ansichten

In einigen Programmiersprachen wie z. Oz, E, und AmbienttalkEs ist möglich, a zu erhalten schreibgeschützte Ansicht einer Zukunft, die es ermöglicht, ihren Wert bei der Auflösung zu lesen, aber nicht die Lösung von ihm zulässt:

  • In Oz die !! Der Bediener wird verwendet, um eine schreibgeschützte Ansicht zu erhalten.
  • In E und Ambienttalk wird eine Zukunft durch zwei Wertepaare als a dargestellt Versprechen/Resolverpaar. Das Versprechen stellt die schreibgeschützte Ansicht dar, und der Resolver ist erforderlich, um den Wert der Zukunft festzulegen.
  • Im C ++ 11 a STD :: Zukunft Bietet eine schreibgeschützte Ansicht. Der Wert wird direkt mit a eingestellt STD :: Versprechen, oder auf das Ergebnis eines Funktionsaufrufs eingestellt werden std :: packaged_task oder std :: asynchron.
  • In dem Dojo -Toolkit's aufgeschobene API ab Version 1.5, a Verbraucher nur Verbraucher stellt eine schreibgeschützte Ansicht dar.[7]
  • Im Alice Ml, Futures liefern a schreibgeschützte Ansicht, während ein Versprechen sowohl eine Zukunft als auch die Fähigkeit enthält, die Zukunft zu lösen[8][9]
  • Im .NET Framework 4.0 System.Threading.tasks.task stellt eine schreibgeschützte Ansicht dar. Das Auflösen des Wertes kann über durch System.Threading.Tasks.TaskCompletionsource.

Die Unterstützung für schreibgeschützte Ansichten steht im Einklang mit dem Prinzip der geringsten Privilegienda es die Möglichkeit ermöglicht, den Wert festzulegen, auf den eingeschränkt werden kann Themen das muss es setzen. In einem System, das auch Pipelining unterstützt, erhält der Absender einer asynchronen Nachricht (mit Ergebnis) das schreibgeschützte Versprechen für das Ergebnis, und das Ziel der Nachricht empfängt den Resolver.

Thread-spezifische Zukunft

Einige Sprachen, wie z. Alice MlDefinieren Sie Futures, die mit einem bestimmten Thread verbunden sind, der den Wert der Zukunft berechnet.[9] Diese Berechnung kann entweder beginnen eifrig Wenn die Zukunft erstellt wird, oder träge Wenn sein Wert zum ersten Mal benötigt wird. Eine faule Zukunft ähnelt einem Thunkim Sinne einer verzögerten Berechnung.

Alice ML unterstützt auch Futures, die von jedem Thread gelöst werden können, und ruft diese auf Versprechen.[8] Diese Verwendung von versprechen unterscheidet sich von seiner Verwendung in E wie beschrieben Oben. In Alice ist ein Versprechen keine schreibgeschützte Sichtweise, und das Versprechen-Pipelining wird nicht unterstützt. Stattdessen erfolgt das Pipelining natürlich für Futures, einschließlich derjenigen, die mit Versprechen verbunden sind.

Blockieren gegen nicht blockierende Semantik

Wenn auf den Wert einer Zukunft asynchron zugegriffen wird, zum Beispiel durch Senden einer Nachricht an sie oder durch explizites Warten auf ein Konstrukt wie z. Wenn In E gibt es keine Schwierigkeit, sich zu verzögern, bis die Zukunft gelöst wird, bevor die Nachricht empfangen oder die Wartezeit abgeschlossen wird. Dies ist der einzige Fall, der in rein asynchronen Systemen wie reinen Schauspielersprachen berücksichtigt wird.

In einigen Systemen kann es jedoch auch möglich sein, es zu versuchen sofort oder synchron Zugang zu dem Wert einer Zukunft. Dann gibt es eine Designauswahl zu treffen:

  • Der Zugriff kann den aktuellen Thread oder den aktuellen Prozess blockieren, bis die Zukunft aufgelöst wird (möglicherweise mit einer Auszeit). Dies ist die Semantik von Datenflussvariablen in der Sprache Oz.
  • Der versuchte synchrone Zugriff kann immer einen Fehler signalisieren, beispielsweise ein Werfen eines Ausnahme. Dies ist die Semantik von Fernversprechen in E.[10]
  • Möglicherweise könnte der Zugriff erfolgreich sein, wenn die Zukunft bereits aufgelöst ist, jedoch einen Fehler signalisieren, wenn dies nicht der Fall ist. Dies hätte den Nachteil, den Nichtdeterminismus einzuführen und das Potenzial für Rennbedingungenund scheint eine ungewöhnliche Designwahl zu sein.

Als Beispiel für die erste Möglichkeit in C ++ 11, ein Thread, der den Wert einer Zukunft benötigt, kann blockieren, bis er verfügbar ist Warten() oder erhalten() Mitgliedsfunktionen. Sie können auch eine Zeitüberschreitung auf der Wartezeit mit dem angeben warten auf() oder warte bis() Mitgliedsfunktionen, um eine unbestimmte Blockierung zu vermeiden. Wenn die Zukunft aus einem Aufruf an entstand std :: asynchron Dann kann ein Blockierungswart (ohne Auszeit) eine synchrone Aufruf der Funktion verursachen, um das Ergebnis auf dem wartenden Thread zu berechnen.

Verwandte Konstrukte

Futures sind ein besonderer Fall der Synchronisation Primitive "Veranstaltungen, "Welches kann nur einmal fertiggestellt werden. Im Allgemeinen können Ereignisse auf den anfänglichen leeren Zustand zurückgesetzt und so viele Male wie Sie möchten.[11]

Ein I-var (wie in der Sprache Ausweis) ist eine Zukunft mit Blockierung der Semantik wie oben definiert. Ein I-struktur ist ein Datenstruktur I-Vars enthalten. Ein verwandtes Synchronisationskonstrukt, das mehrmals mit unterschiedlichen Werten festgelegt werden kann M-var. M-VARs unterstützen atomare Operationen zu nehmen oder stellen Der aktuelle Wert, bei dem der Wert auch den M-VAR auf seine Anfangswerte zurückführt leer Zustand.[12]

A Gleichzeitige Logikvariable ähnelt einer Zukunft, wird aber von aktualisiert von Vereinigung, so wie Logikvariablen in Logikprogrammierung. Somit kann es mehr als einmal an unifierbare Werte gebunden werden, kann jedoch nicht in einen leeren oder ungelösten Zustand zurückgesetzt werden. Die Datenflow -Variablen von OZ wirken als gleichzeitige Logikvariablen und blockieren auch die oben erwähnte Semantik.

A Gleichzeitige Einschränkungsvariable ist eine Verallgemeinerung der gleichzeitigen Logikvariablen zur Unterstützung Einschränkung der Logikprogrammierung: Die Einschränkung kann sein verengt Mehrmals, was kleinere Werte angeben. Normalerweise gibt es eine Möglichkeit, einen Thunk anzugeben, der ausgeführt werden sollte, wenn die Einschränkung weiter eingeschränkt wird. Dies ist erforderlich, um zu unterstützen Einschränkungsausbreitung.

Beziehungen zwischen der Ausdruckskraft verschiedener Formen der Zukunft

Egere fadenspezifische Futures können in nicht-threadspezifischen Futures unkompliziert implementiert werden, indem ein Thread erstellt wird, um den Wert gleichzeitig mit der Erstellung der Zukunft zu berechnen. In diesem Fall ist es wünschenswert, eine schreibgeschützte Ansicht an den Client zurückzugeben, so dass nur der neu erstellte Thread diese Zukunft beheben kann.

Um implizite faule threadspezifische Zukunft (wie von Alice ML angegeben) in nicht threadspezifischen Zukunft zu implementieren, benötigt ein Mechanismus, um festzustellen, wann der Wert der Zukunft zuerst erforderlich ist (z. B. die, die Warten Sie gebunden Konstrukt in oz[13]). Wenn alle Werte Objekte sind, ist die Fähigkeit, transparente Weiterleitungsobjekte zu implementieren, ausreichend, da die erste an den Spediteur gesendete Nachricht angibt, dass der Wert der Zukunft erforderlich ist.

Nicht threadspezifische Zukunftsfutures können in threadspezifischen Futures implementiert werden, vorausgesetzt, das System unterstützt das Übergeben von Nachrichten, indem der Auflösungs-Thread eine Nachricht an den eigenen Thread der Zukunft sendet. Dies kann jedoch als nicht benötigte Komplexität angesehen werden. In Programmiersprachen, die auf Threads basieren, scheint der ausdrucksvollste Ansatz darin bestehen, eine Mischung aus nicht-threadspezifischen Zukunft, schreibgeschützten Ansichten und entweder einer schreibgeschützten Ansichten bereitzustellen Warten Sie gebunden Konstruktion oder Unterstützung für die transparente Weiterleitung.

Bewertungsstrategie

Das Bewertungsstrategie von Futures, die bezeichnet werden können Rufen Sie nach Zukunft an, ist nicht deterministisch: Der Wert einer Zukunft wird zu einem bestimmten Zeitpunkt zwischen der Erstellung der Zukunft und dem Wert, wenn ihr Wert verwendet wird, aber die genaue Zeit wird vorher nicht bestimmt und kann sich von Lauf zum Lauf ändern. Die Berechnung kann beginnen, sobald die Zukunft erstellt wird (eifrige Bewertung) oder nur wenn der Wert tatsächlich benötigt wird (faule Bewertung) und kann Teil des Teils durchgesetzt oder in einem Lauf ausgeführt werden. Sobald der Wert einer Zukunft zugewiesen ist, wird sie nicht auf zukünftige Zugriffe neu berechnet. Das ist wie das Memoisierung benutzt in Rufen Sie nach Bedarf an.

A Faule Zukunft Ist eine Zukunft, die deterministischerweise eine faule Bewertungssemantik hat: Die Berechnung des Wertes der Zukunft beginnt, wenn der Wert zum ersten Mal benötigt wird, wie in Call nach Bedarf. Lazy Futures sind in Sprachen von Nutzen, die die Bewertungsstrategie standardmäßig nicht faul ist. Zum Beispiel in C ++ 11 Solche faulen Zukunftsfutures können durch Bestehen des STD :: Start :: Deferred Startpolitik an std :: asynchronzusammen mit der Funktion, um den Wert zu berechnen.

Semantik der Futures im Schauspielermodell

Im Schauspielermodell ein Ausdruck der Form Zukunft wird definiert dadurch, wie es auf eine reagiert Bewerten Nachricht mit Umgebung E und Kunde C wie folgt: Der zukünftige Ausdruck reagiert auf die Bewerten Nachricht durch Senden des Kunden C ein neu erstellter Schauspieler F (Der Proxy zur Reaktion der Bewertung ) als Rückgabewert gleichzeitig mit Senden ein Bewerten Nachricht mit Umgebung E und Kunde C. Das Standardverhalten von F ist wie folgt:

  • Wann F erhält eine Anfrage RAnschließend prüft es, ob es bereits eine Antwort erhalten hat (die entweder ein Rückgabewert oder eine geworfene Ausnahme sein kann) von der Bewertung Fortschritte wie folgt:
    1. Wenn es bereits eine Antwort hat V, dann
      • Wenn V ist ein Rückgabewert, dann wird die Anfrage gesendet R.
      • Wenn V ist eine Ausnahme, dann wird es dem Kunden der Anfrage geworfen R.
    2. Wenn es noch keine Antwort gibt, dann R wird in der Warteschlange von Anfragen in der Aufbewahrung gespeichert F.
  • Wann F erhält die Antwort V von der Bewertung , dann V ist in gelagert F und
    • Wenn V ist ein Rückgabewert, dann werden alle Anfragen in die Warteschlange gesendet V.
    • Wenn V ist eine Ausnahme, dann wird es an den Kunden jeder der Anfragen in der Warteschlange geworfen.

Einige Futures können jedoch mit Anfragen auf besondere Weise umgehen, um eine größere Parallelität zu ermöglichen. Zum Beispiel der Ausdruck 1 + zukünftige Fakultät (n) kann eine neue Zukunft schaffen, die sich wie die Nummer verhalten wird 1+faktorial (n). Dieser Trick funktioniert nicht immer. Zum Beispiel der folgende bedingte Ausdruck:

Wenn m> Future Factorial (n) dann drucken ("größer") sonst drucken ("kleiner")

bis die Zukunft für die Zukunft für faktorial (n) hat auf die Anfrage beantwortet gefragt, ob m ist größer als sich selbst.

Geschichte

Das Zukunft und/oder versprechen Konstrukte wurden erstmals in Programmiersprachen wie z. Multilisp und Akt 1. Die Verwendung von Logikvariablen für die Kommunikation in gleichzeitig Logikprogrammierung Sprachen waren Futures ziemlich ähnlich. Diese begannen in Prolog mit Einfrieren und IC Prologund wurde zu einer wahren Parallelitätsprimitiv mit der relationalen Sprache, gleichzeitig Prolog, bewacht Hornklauseln (GHC), Parlog, Strand, Vulkan, Janus, Oz-Mozart, Flow Java, und Alice Ml. Die Einzelausrichtung I-var aus Datenflow -Programmierung Sprachen, die von Ursprung in Ausweis und in Reppy's enthalten Gleichzeitiger ML, ist ähnlich wie die gleichzeitige Logikvariable.

Die Versprechen -Pipelining -Technik (mit Futures zur Überwindung der Latenz) wurde von erfunden Barbara Liskov und Liuba Shrira 1988,,[6] und unabhängig von Mark S. Miller, Dean Tribble und Rob Jellinghaus im Kontext von Projekt Xanadu ca. 1989.[14]

Der Begriff versprechen wurde von Liskov und Shrira geprägt, obwohl sie den Pipelining -Mechanismus mit dem Namen verwiesen haben Rufstream, was jetzt selten verwendet wird.

Sowohl das in Liskov als auch das Papier von Shrira beschriebene Design und die Umsetzung von Versprechen -Pipelining in Xanadu hatten die Grenze, dass Versprechenswerte nicht waren erste Klasse: Ein Argument für oder der Wert, der durch einen Anruf oder Senden zurückgegeben wird direkt ausdrückbar im Call-Stream-Design oder in der Xanadu-Implementierung). Es scheint, dass Versprechen und Anrufstreams in keiner öffentlichen Freilassung von Argus umgesetzt wurden.[15] Die im Liskov- und Shrira -Papier verwendete Programmiersprache. Die Entwicklung von Argus hörte um 1988 auf.[16] Die Xanadu -Implementierung von Promise Pipelining wurde nur mit der Veröffentlichung des Quellcode für Udanax Gold öffentlich verfügbar[17] 1999 und wurde nie in einem veröffentlichten Dokument erklärt.[18] Die späteren Implementierungen in Joule und E unterstützen vollständig erstklassige Versprechen und Resolver.

Mehrere frühe Schauspielersprachen, einschließlich der ACT -Serie,[19][20] unterstützte sowohl parallele Nachrichtenübergänge als auch pipelierte Nachrichtenverarbeitung, versprechen jedoch nicht Pipelining. (Obwohl es technisch möglich ist, die letzten dieser Merkmale in den ersten beiden zu implementieren, gibt es keine Beweise dafür, dass die ACT -Sprachen dies getan haben.)

Nach dem Jahr 2000 trat aufgrund ihrer Verwendung eine große Wiederbelebung des Interesse an Futures und Versprechen auf Empfänglichkeit von Benutzeroberflächen und in Web Entwicklung, aufgrund der Request -Reaktion Modell des Nachrichten-Passings. Mehrere Mainstream -Sprachen haben jetzt Sprachunterstützung für Futures und Versprechen, insbesondere von populärer durch Futuretask in Java 5 (angekündigt 2004)[21] und die asynchron/wartet Konstruktionen in .NET 4.5 (angekündigt 2010, veröffentlicht 2012)[22][23] weitgehend inspiriert von der Asynchrone Workflows aus#,[24] das stammt von 2007.[25] Dies wurde später von anderen Sprachen übernommen, insbesondere von Dart (2014).[26] Python (2015),[27] Hack (HHVM) und Entwürfe von ECMascript 7 (JavaScript), Scala und C ++ (2011).

Liste der Implementierungen

Einige Programmiersprachen unterstützen Futures, Versprechen, gleichzeitige Logikvariablen, Datenflussvariablen oder I-VARs, entweder durch direkte Sprachunterstützung oder in der Standardbibliothek.

Liste der Konzepte im Zusammenhang mit Futures und Versprechen durch Programmiersprache

Zu den Sprachen, die auch das Pipelining für das Versprechen unterstützen, gehören:

Liste der nicht standardmäßigen bibliotheksbasierten Implementierungen von Futures

Coroutinen

Futures können in umgesetzt werden in Coroutinen[27] oder Generatoren,[102] Dies führt zu derselben Bewertungsstrategie (z. B. kooperativer Multitasking oder fauler Bewertung).

Kanäle

Futures können leicht in implementiert werden in Kanäle: Eine Zukunft ist ein Ein-Element-Kanal, und ein Versprechen ist ein Prozess, der an den Kanal sendet und die Zukunft erfüllt.[103][104] Dies ermöglicht die Implementierung von Futures in gleichzeitigen Programmiersprachen mit Unterstützung für Kanäle wie CSP und gehen. Die daraus resultierenden Futures sind explizit, da sie durch Lesen vom Kanal und nicht nur die Bewertung zugänglich sind.

Siehe auch

Verweise

  1. ^ Friedman, Daniel; David Wise (1976). Die Auswirkungen der anwendbaren Programmierung auf die Multiprozessierung. Internationale Konferenz zur parallele Verarbeitung. S. 263–272.
    Vorversion von: Friedman, Daniel; Wise, David (April 1978). "Aspekte der Anwendungsprogrammierung für die parallele Verarbeitung". IEEE -Transaktionen auf Computern. C-27 (4): 289–296. Citeseerx 10.1.1.295.9692. doi:10.1109/tc.1978.1675100. S2CID 16333366.
  2. ^ Hibbard, Peter (1976). Parallele Verarbeitungseinrichtungen. Neue Richtungen in algorithmischen Sprachen, (Hrsg.) Stephen A. Schuman, Iria, 1976.
  3. ^ Henry Baker; Carl Hewitt (August 1977). Die inkrementelle Müllsammlung von Prozessen. Verfahren des Symposiums über Programmiersprachen für künstliche Intelligenz. ACM Sigplan Notices 12, 8. S. 55–59. Archiviert von das Original am 4. Juli 2008. Abgerufen 13. Februar 2015.
  4. ^ Versprechen Sie Pipelining bei erights.org
  5. ^ Versprechen Sie Pipelining auf dem C2 -Wiki
  6. ^ a b Barbara Liskov; Liuba Shrira (1988). "Versprechen: sprachliche Unterstützung für effiziente asynchrone Verfahrensaufrufe in verteilten Systemen". Verfahren der Sigplan '88 -Konferenz zum Entwurf und der Implementierung von Programmiersprachen; Atlanta, Georgia, USA. ACM. S. 260–267. doi:10.1145/53990.54016. ISBN 0-89791-269-1. Auch veröffentlicht in ACM Sigplan nennt 23(7).
  7. ^ Robuste Versprechungen mit dem Aufschieben von Dojo, Site Pen, 3. Mai 2010
  8. ^ a b "Versprechen", Alice -Handbuch, De: uni-sb, archiviert aus das Original am 8. Oktober 2008, abgerufen 21. März 2007
  9. ^ a b "Zukunft", Alice -Handbuch, De: uni-sb, archiviert aus das Original am 6. Oktober 2008, abgerufen 21. März 2007
  10. ^ Versprechen, E Rechte
  11. ^ 500 Zeilen oder weniger, "Ein Web -Crawler mit Asyncio Coroutines" von A. Jesse Jiryu Davis und Guido van Rossum Sagt "Implementierung verwendet anstelle der hier gezeigten Zukunft einen Asyncio.event. Der Unterschied ist, dass ein Ereignis zurückgesetzt werden kann, während eine Zukunft nicht von gelöst auf ausstehend wechseln kann."
  12. ^ Kontrollkontrolle MVAR, Haskell, archiviert von das Original am 18. April 2009
  13. ^ Warten Sie gebunden, Mozart Oz, archiviert aus das Original am 17. Mai 2013, abgerufen 21. März 2007
  14. ^ Versprechen, Sonnenloses Meer, archiviert von das Original am 23. Oktober 2007
  15. ^ Argus, MIT
  16. ^ Liskov, Barbara, Verteiltes Computer und Argus, Oral History, IEEE GHN
  17. ^ GoldUdanax, archiviert von das Original am 11. Oktober 2008
  18. ^ Pipeline, E Rechte
  19. ^ Henry Lieberman (Juni 1981). "Eine Vorschau von Akt 1". MIT AI Memo 625. {{}}: Journal zitieren erfordert |journal= (Hilfe)
  20. ^ Henry Lieberman (Juni 1981). "Über viele Dinge nachdenken, ohne verwirrt zu werden: Parallelität in Akt 1". MIT AI Memo 626. {{}}: Journal zitieren erfordert |journal= (Hilfe)
  21. ^ Goetz, Brian (23. November 2004). "Parallelität in JDK 5.0".
  22. ^ a b "Async in 4.5: Warten wert - .NET Blog - Site Home - MSDN Blogs". Blogs.msdn.com. Abgerufen 13. Mai 2014.
  23. ^ a b c "Asynchrones Programmieren mit Async und wartet (C# und visuelles Basic)". Msdn.microsoft.com. Abgerufen 13. Mai 2014.
  24. ^ Tomas Petricek (29. Oktober 2010). "Asynchron C# und F# (I.): Gleichzeitige Einführung".
  25. ^ Don Syme; Tomas Petricek; Dmitry Lomov (21. Oktober 2010). "Das F# Asynchrone Programmiermodell, Padl 2011".
  26. ^ a b Gilad Bracha (Oktober 2014). "DART Language Asynchrony Support: Phase 1".
  27. ^ a b "PEP 0492 - Coroutinen mit Async und wartet Syntax".
  28. ^ Kenjiro Taura; Satoshi Matsuoka; Akinori Yonezawa (1994). "ABCL/F: Eine zukunftsbasierte polymorphe typisierte gleichzeitige objektorientierte Sprache-seine Gestaltung und Implementierung.". In Proceedings of the DIMACS -Workshop zur Spezifikation paralleler Algorithmen, Nummer 18 in der DIMACS -Serie in diskreten Mathematik und theoretischer Informatik. American Mathematical Society. S. 275–292. Citeseerx 10.1.1.23.1161.
  29. ^ "Dart SDK Dart Async Completeer".
  30. ^ "Aufgabe".
  31. ^ Steve Dekorte (2005). "IO, die Programmiersprache".
  32. ^ "Versprechen verwenden". Mozilla Developer Network. Abgerufen 23. Februar 2021.
  33. ^ "Asynchrone Programmieren erleichtern mit Async und wartet". Mozilla Developer Network. Abgerufen 23. Februar 2021.
  34. ^ Rich Hickey (2009). "Änderungen.txt bei 1.1.x von Richhickey's Clojure". GitHub.
  35. ^ "Zukunft - Kotlin -Programmiersprache".
  36. ^ Seif Haridi; Nils Franzen. "Tutorial von Oz". Mozart Global User Library. Archiviert von das Original am 14. Mai 2011. Abgerufen 12. April 2011.
  37. ^ Python 3.2 Release
  38. ^ Python 3.5 Release
  39. ^ "Parallelität mit Futures". PLT. Abgerufen 2. März 2012.
  40. ^ Versprechen Sie Klasse in Perl 6
  41. ^ "Zukunft in Std :: Zukunft - Rost".
  42. ^ Gemeinsamer Lisp -Amsel
  43. ^ Common Lisp Eager Future2
  44. ^ LISP parallel - eine parallele Programmierbibliothek für Common Lisp
  45. ^ Common Lisp PCall
  46. ^ "Kapitel 30. Thread 4.0.0". Abgerufen 26. Juni 2013.
  47. ^ "DLIB C ++ Bibliothek #Thread_pool". Abgerufen 26. Juni 2013.
  48. ^ "Github-Facebook/Folly: Eine Open-Source-C ++-Bibliothek entwickelt und verwendet bei Facebook". GitHub. 8. Januar 2019.
  49. ^ "HPX". 10. Februar 2019.
  50. ^ "Fäden Folien von Poco" (PDF).
  51. ^ "Qtcore 5.0: Qfuture -Klasse". QT -Projekt. Archiviert von das Original am 1. Juni 2013. Abgerufen 26. Juni 2013.
  52. ^ "Seestern". SEASTAR -Projekt. Abgerufen 22. August 2016.
  53. ^ "STLAB ist die laufende Arbeit des Softwaretechnologie -Labors von Adobe.. 31. Januar 2021.
  54. ^ Groovy GPARS Archiviert 12. Januar 2013 bei der Wayback -Maschine
  55. ^ Cujo.js
  56. ^ JavaScript When.js
  57. ^ Versprechen/A+ Spezifikation
  58. ^ Versprechen
  59. ^ JavaScript Mochkit.async
  60. ^ JavaScript Angularjs
  61. ^ JavaScript-Knoten-Verhütung
  62. ^ "JavaScript Q". Archiviert von das Original am 31. Dezember 2018. Abgerufen 8. April 2013.
  63. ^ JavaScript rsvp.js
  64. ^ Yui JavaScript -Klassenbibliothek
  65. ^ Yui JavaScript Promise -Klasse
  66. ^ JavaScript Bluebird
  67. ^ Java Jdeferred
  68. ^ Java Parseq
  69. ^ Objective-C Mafuture Github
  70. ^ Objective-C Mafuture mikeash.com
  71. ^ Objektiv-c rxpromise
  72. ^ OBJC-Collapsingfutures
  73. ^ Objektiv-C Promisekit
  74. ^ Objective-C OBJC-Verhütung
  75. ^ Objektiv-C-Oapromise
  76. ^ Ocaml faul
  77. ^ Perl Zukunft
  78. ^ Perl verspricht
  79. ^ Perl Reflex
  80. ^ Perl Versprechen :: es6
  81. ^ "Versprechen :: xs - schnelle Versprechen in Perl - metacpan.org". metacpan.org. Abgerufen 14. Februar 2021.
  82. ^ PHP React/Versprechen
  83. ^ Python-integrierte Implementierung
  84. ^ Pythonfuturen
  85. ^ Verdrehte Aufschiebungen
  86. ^ R -Paket Zukunft
  87. ^ Zukunft
  88. ^ Ruby Versprechen Juwel
  89. ^ Ruby Libuv
  90. ^ "Ruby Celluloid Edelstein". Archiviert von das Original am 8. Mai 2013. Abgerufen 19. Februar 2022.
  91. ^ Ruby Future-Ressource
  92. ^ Futures-Rs-Kiste
  93. ^ Twitters Utilbibliothek
  94. ^ "Swift Async". Archiviert von das Original am 31. Dezember 2018. Abgerufen 23. Juni 2014.
  95. ^ Swift FutureKit
  96. ^ Swift Apple GCD
  97. ^ Swift Futurelib
  98. ^ BignerDranch/aufgeschoben
  99. ^ Thomvis/Brightfutures
  100. ^ Belozierov/SwiftCoroutine
  101. ^ TCL-Verhütung
  102. ^ Löst Async/wartet ein echtes Problem?
  103. ^ Gehen Sie Sprachmuster Futures
  104. ^ Gehen Sie Sprachmuster

Externe Links