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 och ProactorEventLoop 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 ett RuntimeError 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())