Futures¶
Källkod: Lib/asyncio/futures.py, Lib/asyncio/base_futures.py
Future-objekt används för att överbrygga kallelsebaserad kod på låg nivå med async/await-kod på hög nivå.
Framtida funktioner¶
- asyncio.isfuture(obj)¶
Returnera
True
om obj är något av:en instans av
asyncio.Future
,en instans av
asyncio.Task
,ett Future-liknande objekt med attributet
_asyncio_future_blocking
.
Tillagd i version 3.5.
- asyncio.ensure_future(obj, *, loop=None)¶
Returnera:
obj argument som det är, om obj är en
Future
, enTask
, eller ett Future-liknande objekt (isfuture()
används för testet.)ett
Task
-objekt som omsluter obj, om obj är en coroutine (iscoroutine()
används för testet); i detta fall kommer coroutinen att schemaläggas medensure_future()
.ett
Task
-objekt som skulle awaita på obj, om obj är en awaitable (inspect.isawaitable()
används för testet.)
Om obj inte är någon av de ovan nämnda händelserna uppstår ett
TypeError
.Viktigt
Spara en referens till resultatet av denna funktion, för att undvika att en uppgift försvinner mitt under utförandet.
Se även funktionen
create_task()
som är det föredragna sättet att skapa nya uppgifter eller användasyncio.TaskGroup
som håller referensen till uppgiften internt.Ändrad i version 3.5.1: Funktionen accepterar alla awaitable-objekt.
Föråldrad sedan version 3.10: Deprecation-varning utfärdas om obj inte är ett Future-liknande objekt och loop inte anges och det inte finns någon pågående händelseslinga.
- asyncio.wrap_future(future, *, loop=None)¶
Packa in ett
concurrent.futures.Future
-objekt i ettasyncio.Future
-objekt.Föråldrad sedan version 3.10: Deprecation-varning utfärdas om future inte är ett Future-liknande objekt och loop inte anges och det inte finns någon pågående händelseslinga.
Framtida objekt¶
- class asyncio.Future(*, loop=None)¶
En Future representerar ett eventuellt resultat av en asynkron operation. Inte tråd-säker.
Future är ett awaitable-objekt. Coroutines kan vänta på Future-objekt tills de antingen har ett resultat eller ett undantag inställt, eller tills de avbryts. En Future kan väntas flera gånger och resultatet blir detsamma.
Futures används vanligtvis för att göra det möjligt för callback-baserad kod på låg nivå (t.ex. i protokoll som implementeras med asyncio transports) att samverka med async/await-kod på hög nivå.
Tumregeln är att aldrig exponera Future-objekt i API:er som vänder sig till användare, och det rekommenderade sättet att skapa ett Future-objekt är att anropa
loop.create_future()
. På så sätt kan alternativa implementeringar av händelseslingor injicera sina egna optimerade implementeringar av ett Future-objekt.Ändrad i version 3.7: Lagt till stöd för modulen
contextvars
.Föråldrad sedan version 3.10: Deprecation-varning utfärdas om loop inte anges och det inte finns någon pågående händelseslinga.
- result()¶
Returnera resultatet av Future.
Om Future är done och har ett resultat som ställts in med metoden
set_result()
, returneras resultatvärdet.Om Future är done och har ett undantag som ställts in med metoden
set_exception()
, kommer undantaget att tas upp med denna metod.Om framtiden har avbrutits, ger denna metod upphov till ett
CancelledError
-undantag.Om framtidens resultat ännu inte är tillgängligt, ger denna metod upphov till ett
InvalidStateError
-undantag.
- set_result(result)¶
Markera Future som utförd och ange dess resultat.
Utlöser ett
InvalidStateError
-fel om Future redan är done.
- set_exception(exception)¶
Markera Future som done och ställ in ett undantag.
Utlöser ett
InvalidStateError
-fel om Future redan är done.
- done()¶
Returnerar
True
om framtiden är done.En Future är done om den cancelled eller om den har ett resultat eller ett undantag som ställts in med
set_result()
ellerset_exception()
anrop.
- cancelled()¶
Returnerar
True
om Framtiden var avbruten.Metoden används vanligtvis för att kontrollera om en Future inte är cancelled innan ett resultat eller ett undantag anges för den:
om inte fut.cancelled(): fut.set_result(42)
- add_done_callback(callback, *, context=None)¶
Lägg till en återuppringning som ska köras när Future är done.
Callback anropas med Future-objektet som enda argument.
Om Future redan är färdig när den här metoden anropas, schemaläggs återuppringningen med
loop.call_soon()
.Ett valfritt argument context med endast nyckelord gör det möjligt att ange en anpassad
contextvars.Context
som callback ska köras i. Den aktuella kontexten används när ingen kontext anges.functools.partial()
kan användas för att skicka parametrar till återuppringningen, t.ex.:# Call 'print("Future:", fut)' when "fut" is done. fut.add_done_callback( functools.partial(print, "Future:"))
Ändrad i version 3.7: Parametern context (endast nyckelord) har lagts till. Se PEP 567 för mer information.
- remove_done_callback(callback)¶
Ta bort callback från listan över callbacks.
Returnerar antalet borttagna återuppringningar, vilket vanligtvis är 1, såvida inte en återuppringning har lagts till mer än en gång.
- cancel(msg=None)¶
Avbryt Future och schemalägg callbacks.
Om framtiden redan är done eller cancelled, returneras
False
. I annat fall ändras Framtidens tillstånd till avbruten, schemalägger återuppringningarna och returnerarTrue
.Ändrad i version 3.9: Parametern msg har lagts till.
- exception()¶
Returnerar det undantag som ställdes in för denna Future.
Undantaget (eller
None
om inget undantag har angetts) returneras endast om Future är done.Om framtiden har avbrutits, ger denna metod upphov till ett
CancelledError
-undantag.Om Future inte är färdig ännu, ger denna metod upphov till ett
InvalidStateError
-undantag.
- get_loop()¶
Returnerar den händelseslinga som Future-objektet är bundet till.
Tillagd i version 3.7.
I det här exemplet skapas ett Future-objekt, en asynkron Task skapas och schemaläggs för att ange resultat för Future och väntar tills Future har ett resultat:
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())
Viktigt
Future-objektet har utformats för att efterlikna concurrent.futures.Future
. Viktiga skillnader inkluderar:
till skillnad från asyncio Futures, kan
concurrent.futures.Future
-instanser inte inväntas.asyncio.Future.result()
ochasyncio.Future.exception()
accepterar inte argumentet timeout.asyncio.Future.result()
ochasyncio.Future.exception()
ger upphov till ettInvalidStateError
undantag när framtiden inte är done.Återanrop som registrerats med
asyncio.Future.add_done_callback()
anropas inte omedelbart. De schemaläggs medloop.call_soon()
istället.asyncio Future är inte kompatibel med funktionerna
concurrent.futures.wait()
ochconcurrent.futures.as_completed()
.asyncio.Future.cancel()
accepterar ett valfrittmsg
argument, menconcurrent.futures.Future.cancel()
gör det inte.