Policys¶
Varning
Policies är föråldrade och kommer att tas bort i Python 3.16. Användare uppmuntras att använda funktionen asyncio.run()
eller asyncio.Runner
med loop_factory för att använda önskad loopimplementering.
En policy för en händelseslinga är ett globalt objekt som används för att hämta och ställa in den aktuella händelseslingan, samt för att skapa nya händelseslingor. Standardpolicyn kan ersättas med inbyggda alternativ för att använda olika implementeringar av händelseslingor, eller ersättas av en anpassad policy som kan åsidosätta dessa beteenden.
Policyobjekt hämtar och ställer in en separat händelseslinga per kontext. Detta är per tråd som standard, men anpassade policyer kan definiera kontext på ett annat sätt.
Anpassade principer för händelseslingor kan styra beteendet hos get_event_loop()
, set_event_loop()
och new_event_loop()
.
Policyobjekt bör implementera de API:er som definieras i den abstrakta basklassen AbstractEventLoopPolicy
.
Hämta och ställa in policyn¶
Följande funktioner kan användas för att hämta och ställa in policyn för den aktuella processen:
- asyncio.get_event_loop_policy()¶
Returnera den aktuella processomfattande policyn.
Föråldrad sedan version 3.14: Funktionen
get_event_loop_policy()
är föråldrad och kommer att tas bort i Python 3.16.
- asyncio.set_event_loop_policy(policy)¶
Ställ in den aktuella processomfattande policyn till policy.
Om policy är inställd på
None
återställs standardpolicyn.Föråldrad sedan version 3.14: Funktionen
set_event_loop_policy()
är föråldrad och kommer att tas bort i Python 3.16.
Policyobjekt¶
Den abstrakta basklassen för policyn för händelseslingor definieras enligt följande:
- class asyncio.AbstractEventLoopPolicy¶
En abstrakt basklass för asyncio-policyer.
- get_event_loop()¶
Hämta händelseslingan för det aktuella sammanhanget.
Returnerar ett objekt med en händelseslinga som implementerar gränssnittet
AbstractEventLoop
.Denna metod bör aldrig returnera
None
.Ändrad i version 3.6.
- set_event_loop(loop)¶
Ställ in händelseslingan för den aktuella kontexten till loop.
- new_event_loop()¶
Skapa och returnera ett nytt objekt för händelseslingan.
Denna metod bör aldrig returnera
None
.
Föråldrad sedan version 3.14: Klassen
AbstractEventLoopPolicy
är föråldrad och kommer att tas bort i Python 3.16.
asyncio levereras med följande inbyggda policyer:
- class asyncio.DefaultEventLoopPolicy¶
Standardpolicyn för asyncio. Använder
SelectorEventLoop
på Unix ochProactorEventLoop
på Windows.Det finns inget behov av att installera standardpolicyn manuellt. asyncio är konfigurerat för att använda standardpolicyn automatiskt.
Ändrad i version 3.8: På Windows används nu
ProactorEventLoop
som standard.Ändrad i version 3.14: Metoden
get_event_loop()
i standardpolicyn för asyncio ger nu upphov till ettRuntimeError
om det inte finns någon angiven händelseslinga.Föråldrad sedan version 3.14: Klassen
DefaultEventLoopPolicy
är föråldrad och kommer att tas bort i Python 3.16.
- class asyncio.WindowsSelectorEventLoopPolicy¶
En alternativ policy för händelseslinga som använder implementeringen av händelseslingan
SelectorEventLoop
.Tillgänglighet: Windows.
Föråldrad sedan version 3.14: Klassen
WindowsSelectorEventLoopPolicy
är föråldrad och kommer att tas bort i Python 3.16.
- class asyncio.WindowsProactorEventLoopPolicy¶
En alternativ policy för händelseslinga som använder implementeringen av händelseslingan
ProactorEventLoop
.Tillgänglighet: Windows.
Föråldrad sedan version 3.14: Klassen
WindowsProactorEventLoopPolicy
är föråldrad och kommer att tas bort i Python 3.16.
Anpassade policyer¶
För att implementera en ny policy för händelseslingor rekommenderas att man subklassar DefaultEventLoopPolicy
och åsidosätter de metoder för vilka man vill ha ett anpassat beteende, t.ex.:
class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):
def get_event_loop(self):
"""Hämta händelseslingan.
Detta kan vara None eller en instans av EventLoop.
"""
loop = super().get_event_loop()
# Gör något med slingan ...
return loop
asyncio.set_event_loop_policy(MyEventLoopPolicy())