Richtlinien

Warnung

Richtlinien sind veraltet und werden in Python 3.16 entfernt. Benutzer werden ermutigt, die Funktion asyncio.run() oder asyncio.Runner mit loop_factory zu verwenden, um die gewünschte Schleifenimplementierung zu nutzen.

Eine Ereignisschleifenrichtlinie ist ein globales Objekt, das verwendet wird, um die aktuelle Ereignisschleife abzurufen und festzulegen sowie neue Ereignisschleifen zu erstellen. Die Standardrichtlinie kann durch eingebaute Alternativen ersetzt werden, um andere Implementierungen von Ereignisschleifen zu verwenden, oder durch eine benutzerdefinierte Richtlinie ersetzt werden, die dieses Verhalten überschreiben kann.

Das Richtlinienobjekt ruft eine separate Ereignisschleife pro Kontext ab und legt diese fest. Standardmäßig ist dies pro Thread, benutzerdefinierte Richtlinien könnten Kontext jedoch anders definieren.

Benutzerdefinierte Ereignisschleifenrichtlinien können das Verhalten von get_event_loop(), set_event_loop() und new_event_loop() steuern.

Richtlinienobjekte sollten die in der abstrakten Basisklasse AbstractEventLoopPolicy definierten APIs implementieren.

Richtlinie abrufen und festlegen

Die folgenden Funktionen können verwendet werden, um die Richtlinie für den aktuellen Prozess abzurufen und festzulegen.

asyncio.get_event_loop_policy()

Gibt die aktuelle prozessweite Richtlinie zurück.

Veraltet seit Version 3.14: Die Funktion get_event_loop_policy() ist veraltet und wird in Python 3.16 entfernt.

asyncio.set_event_loop_policy(policy)

Setzt die aktuelle prozessweite Richtlinie auf policy.

Wenn policy auf None gesetzt wird, wird die Standardrichtlinie wiederhergestellt.

Veraltet seit Version 3.14: Die Funktion set_event_loop_policy() ist veraltet und wird in Python 3.16 entfernt.

Richtlinienobjekte

Die abstrakte Basisklasse für Ereignisschleifenrichtlinien ist wie folgt definiert:

class asyncio.AbstractEventLoopPolicy

Eine abstrakte Basisklasse für asyncio-Richtlinien.

get_event_loop()

Ruft die Ereignisschleife für den aktuellen Kontext ab.

Gibt ein Ereignisschleifenobjekt zurück, das die Schnittstelle AbstractEventLoop implementiert.

Diese Methode sollte niemals None zurückgeben.

Geändert in Version 3.6.

set_event_loop(loop)

Setzt die Ereignisschleife für den aktuellen Kontext auf loop.

new_event_loop()

Erstellt und gibt ein neues Ereignisschleifenobjekt zurück.

Diese Methode sollte niemals None zurückgeben.

Veraltet seit Version 3.14: Die Klasse AbstractEventLoopPolicy ist veraltet und wird in Python 3.16 entfernt.

asyncio wird mit den folgenden integrierten Richtlinien ausgeliefert

class asyncio.DefaultEventLoopPolicy

Die Standard-asyncio-Richtlinie. Verwendet SelectorEventLoop unter Unix und ProactorEventLoop unter Windows.

Die Standardrichtlinie muss nicht manuell installiert werden. asyncio ist so konfiguriert, dass es die Standardrichtlinie automatisch verwendet.

Geändert in Version 3.8: Unter Windows wird standardmäßig ProactorEventLoop verwendet.

Geändert in Version 3.14: Die Methode get_event_loop() der Standard-asyncio-Richtlinie löst nun einen RuntimeError aus, wenn keine Ereignisschleife gesetzt ist.

Veraltet seit Version 3.14: Die Klasse DefaultEventLoopPolicy ist veraltet und wird in Python 3.16 entfernt.

class asyncio.WindowsSelectorEventLoopPolicy

Eine alternative Ereignisschleifenrichtlinie, die die SelectorEventLoop-Ereignisschleifenimplementierung verwendet.

Verfügbarkeit: Windows.

Veraltet seit Version 3.14: Die Klasse WindowsSelectorEventLoopPolicy ist veraltet und wird in Python 3.16 entfernt.

class asyncio.WindowsProactorEventLoopPolicy

Eine alternative Ereignisschleifenrichtlinie, die die ProactorEventLoop-Ereignisschleifenimplementierung verwendet.

Verfügbarkeit: Windows.

Veraltet seit Version 3.14: Die Klasse WindowsProactorEventLoopPolicy ist veraltet und wird in Python 3.16 entfernt.

Benutzerdefinierte Richtlinien

Um eine neue Ereignisschleifenrichtlinie zu implementieren, wird empfohlen, von DefaultEventLoopPolicy abzuleiten und die Methoden zu überschreiben, für die ein benutzerdefiniertes Verhalten gewünscht wird, z. B.:

class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Get the event loop.

        This may be None or an instance of EventLoop.
        """
        loop = super().get_event_loop()
        # Do something with loop ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())