Futures¶
Quellcode: Lib/asyncio/futures.py, Lib/asyncio/base_futures.py
Future-Objekte werden verwendet, um **Callback-basierten Low-Level-Code** mit High-Level-Async/Await-Code zu verbinden.
Zukunftsfunktionen¶
- asyncio.isfuture(obj)¶
Gibt
Truezurück, wenn obj eines der folgenden ist:eine Instanz von
asyncio.Future,eine Instanz von
asyncio.Task,ein zukunftsähnliches Objekt mit einem Attribut
_asyncio_future_blocking.
Hinzugefügt in Version 3.5.
- asyncio.ensure_future(obj, *, loop=None)¶
Gibt das obj-Argument unverändert zurück, wenn obj ein
Future, einTaskoder ein zukunftsähnliches Objekt ist (für den Test wirdisfuture()verwendet).Gibt das obj-Argument unverändert zurück, wenn obj ein
Future, einTaskoder ein zukunftsähnliches Objekt ist (isfuture()wird für den Test verwendet).ein
Task-Objekt, das obj umschließt, wenn obj eine Coroutine ist (iscoroutine()wird für den Test verwendet); in diesem Fall wird die Coroutine vonensure_future()geplant.ein
Task-Objekt, das auf obj wartet, wenn obj ein Awaitable ist (inspect.isawaitable()wird für den Test verwendet).
Wenn obj keiner der oben genannten Typen ist, wird ein
TypeErrorausgelöst.Wichtig
Speichern Sie eine Referenz auf das Ergebnis dieser Funktion, um zu verhindern, dass eine Aufgabe mitten in der Ausführung verschwindet.
Siehe auch die Funktion
create_task(), die die bevorzugte Methode zum Erstellen neuer Aufgaben ist, oder verwenden Sieasyncio.TaskGroup, die die Referenz auf die Aufgabe intern speichert.Geändert in Version 3.5.1: Die Funktion akzeptiert jedes awaitable-Objekt.
Veraltet seit Version 3.10: Eine Deprecation-Warnung wird ausgegeben, wenn obj kein zukunftsähnliches Objekt ist und loop nicht angegeben ist und keine laufende Ereignisschleife vorhanden ist.
- asyncio.wrap_future(future, *, loop=None)¶
Wickelt ein
concurrent.futures.Future-Objekt in einasyncio.Future-Objekt.Veraltet seit Version 3.10: Eine Deprecation-Warnung wird ausgegeben, wenn future kein zukunftsähnliches Objekt ist und loop nicht angegeben ist und keine laufende Ereignisschleife vorhanden ist.
Future-Objekt¶
- class asyncio.Future(*, loop=None)¶
Ein Future repräsentiert ein zukünftiges Ergebnis einer asynchronen Operation. Nicht threadsicher.
Future ist ein awaitable-Objekt. Coroutinen können auf Future-Objekte warten, bis sie entweder ein Ergebnis oder eine Ausnahme gesetzt haben oder bis sie abgebrochen wurden. Ein Future kann mehrmals abgefragt werden und das Ergebnis ist dasselbe.
Futures werden typischerweise verwendet, um Callback-basierten Low-Level-Code (z. B. in Protokollen, die mit asyncio Transports implementiert sind) mit High-Level-Async/Await-Code interoperabel zu machen.
Die Faustregel ist, niemals Future-Objekte in benutzersichtbaren APIs preiszugeben. Die empfohlene Methode zum Erstellen eines Future-Objekts ist der Aufruf von
loop.create_future(). Auf diese Weise können alternative Ereignisschleifenimplementierungen ihre eigenen optimierten Implementierungen eines Future-Objekts injizieren.Geändert in Version 3.7: Unterstützung für das Modul
contextvarshinzugefügt.Veraltet seit Version 3.10: Eine Deprecation-Warnung wird ausgegeben, wenn loop nicht angegeben ist und keine laufende Ereignisschleife vorhanden ist.
- result()¶
Gibt das Ergebnis des Future zurück.
Wenn das Future done ist und ein Ergebnis durch die Methode
set_result()gesetzt wurde, wird der Ergebniswert zurückgegeben.Wenn das Future done ist und eine Ausnahme durch die Methode
set_exception()gesetzt wurde, löst diese Methode die Ausnahme aus.Wenn das Future *abgebrochen* wurde, löst diese Methode eine
CancelledError-Ausnahme aus.Wenn das Ergebnis des Future noch nicht verfügbar ist, löst diese Methode eine
InvalidStateError-Ausnahme aus.
- set_result(result)¶
Markiert das Future als done und setzt sein Ergebnis.
Löst eine
InvalidStateErroraus, wenn das Future bereits done ist.
- set_exception(exception)¶
Markiert das Future als done und setzt eine Ausnahme.
Löst eine
InvalidStateErroraus, wenn das Future bereits done ist.
- done()¶
Gibt
Truezurück, wenn das Future done ist.Ein Future ist done, wenn es *abgebrochen* wurde oder wenn es ein Ergebnis oder eine Ausnahme hat, die mit den Methoden
set_result()oderset_exception()gesetzt wurde.
- cancelled()¶
Gibt
Truezurück, wenn das Future *abgebrochen* wurde.Die Methode wird normalerweise verwendet, um zu überprüfen, ob ein Future nicht *abgebrochen* wurde, bevor ihm ein Ergebnis oder eine Ausnahme zugewiesen wird.
if not fut.cancelled(): fut.set_result(42)
- add_done_callback(callback, *, context=None)¶
Fügt einen Callback hinzu, der aufgerufen werden soll, wenn das Future done ist.
Der callback wird mit dem Future-Objekt als einzigem Argument aufgerufen.
Wenn das Future bereits done ist, wenn diese Methode aufgerufen wird, wird der Callback mit
loop.call_soon()geplant.Ein optionales Keyword-only context-Argument ermöglicht die Angabe eines benutzerdefinierten
contextvars.Context, in dem der callback ausgeführt werden soll. Der aktuelle Kontext wird verwendet, wenn kein context angegeben wird.functools.partial()kann verwendet werden, um Parameter an den Callback zu übergeben, z. B.# Call 'print("Future:", fut)' when "fut" is done. fut.add_done_callback( functools.partial(print, "Future:"))
Geändert in Version 3.7: Das Keyword-only-Parameter context wurde hinzugefügt. Siehe PEP 567 für weitere Details.
- remove_done_callback(callback)¶
Entfernt callback aus der Callback-Liste.
Gibt die Anzahl der entfernten Callbacks zurück, was typischerweise 1 ist, es sei denn, ein Callback wurde mehrmals hinzugefügt.
- cancel(msg=None)¶
Bricht das Future ab und plant die Callbacks.
Wenn das Future bereits done oder cancelled ist, wird
Falsezurückgegeben. Andernfalls wird der Zustand des Future auf cancelled geändert, die Callbacks werden geplant und es wirdTruezurückgegeben.Geändert in Version 3.9: Der Parameter msg wurde hinzugefügt.
- exception()¶
Gibt die Ausnahme zurück, die für dieses Future gesetzt wurde.
Die Ausnahme (oder
None, wenn keine Ausnahme gesetzt wurde) wird nur zurückgegeben, wenn das Future done ist.Wenn das Future *abgebrochen* wurde, löst diese Methode eine
CancelledError-Ausnahme aus.Wenn das Future noch nicht done ist, löst diese Methode eine
InvalidStateError-Ausnahme aus.
- get_loop()¶
Gibt die Ereignisschleife zurück, an die das Future-Objekt gebunden ist.
Hinzugefügt in Version 3.7.
Dieses Beispiel erstellt ein Future-Objekt, erstellt und plant eine asynchrone Aufgabe, um das Ergebnis für das Future zu setzen, und wartet, bis das Future ein Ergebnis hat.
async def set_after(fut, delay, value):
# Sleep for *delay* seconds.
await asyncio.sleep(delay)
# Set *value* as a result of *fut* Future.
fut.set_result(value)
async def main():
# Get the current event loop.
loop = asyncio.get_running_loop()
# Create a new Future object.
fut = loop.create_future()
# Run "set_after()" coroutine in a parallel Task.
# We are using the low-level "loop.create_task()" API here because
# we already have a reference to the event loop at hand.
# Otherwise we could have just used "asyncio.create_task()".
loop.create_task(
set_after(fut, 1, '... world'))
print('hello ...')
# Wait until *fut* has a result (1 second) and print it.
print(await fut)
asyncio.run(main())
Wichtig
Das Future-Objekt wurde so konzipiert, dass es concurrent.futures.Future imitiert. Wesentliche Unterschiede sind:
Im Gegensatz zu asyncio Futures können
concurrent.futures.Future-Instanzen nicht abgefragt werden.asyncio.Future.result()undasyncio.Future.exception()akzeptieren das Argument timeout nicht.asyncio.Future.result()undasyncio.Future.exception()lösen eineInvalidStateError-Ausnahme aus, wenn das Future nicht done ist.Callbacks, die mit
asyncio.Future.add_done_callback()registriert wurden, werden nicht sofort aufgerufen. Sie werden stattdessen mitloop.call_soon()geplant.asyncio Future ist nicht kompatibel mit den Funktionen
concurrent.futures.wait()undconcurrent.futures.as_completed().asyncio.Future.cancel()akzeptiert ein optionales Argumentmsg,concurrent.futures.Future.cancel()jedoch nicht.