Erweiterungen¶
Die Hauptrichtung für die Erweiterung von asyncio ist das Schreiben benutzerdefinierter Ereignisschleifen-Klassen. Asyncio bietet Hilfsmittel, die diese Aufgabe vereinfachen können.
Hinweis
Drittanbieter sollten bestehenden asyncio-Code mit Vorsicht wiederverwenden; eine neue Python-Version kann die Abwärtskompatibilität im internen Teil der API brechen.
Schreiben einer benutzerdefinierten Ereignisschleife¶
asyncio.AbstractEventLoop deklariert sehr viele Methoden. Alle von Grund auf zu implementieren ist eine mühsame Aufgabe.
Eine Schleife kann viele gängige Methodenimplementierungen kostenlos erhalten, indem sie von asyncio.BaseEventLoop erbt.
Der Nachfolger muss wiederum eine Reihe von privaten Methoden implementieren, die in asyncio.BaseEventLoop deklariert, aber nicht implementiert sind.
Zum Beispiel prüft loop.create_connection() Argumente, löst DNS-Adressen auf und ruft loop._make_socket_transport() auf, was von der geerbten Klasse implementiert werden sollte. Die Methode _make_socket_transport() ist nicht dokumentiert und gilt als interne API.
Private Konstruktoren für Future und Task¶
asyncio.Future und asyncio.Task sollten niemals direkt erstellt werden. Bitte verwenden Sie stattdessen die entsprechenden Factory-Funktionen loop.create_future() und loop.create_task() oder asyncio.create_task().
Benutzerdefinierte Ereignisschleifen von Drittanbietern können jedoch eingebaute Future- und Task-Implementierungen wiederverwenden, um kostenlose, komplexe und hochoptimierte Funktionalität zu erhalten.
Zu diesem Zweck sind die folgenden, privaten Konstruktoren aufgeführt
- Future.__init__(*, loop=None)¶
Erstellt eine integrierte Future-Instanz.
loop ist eine optionale Ereignisschleifen-Instanz.
- Task.__init__(coro, *, loop=None, name=None, context=None)¶
Erstellt eine integrierte Task-Instanz.
loop ist eine optionale Ereignisschleifen-Instanz. Die restlichen Argumente sind in der Beschreibung von
loop.create_task()beschrieben.Geändert in Version 3.11: Das Argument context wurde hinzugefügt.
Unterstützung der Task-Lebensdauer¶
Eine Task-Implementierung eines Drittanbieters sollte die folgenden Funktionen aufrufen, um eine Task für asyncio.all_tasks() und asyncio.current_task() sichtbar zu halten
- asyncio._register_task(task)¶
Registriert eine neue Task als von asyncio verwaltet.
Rufen Sie die Funktion aus einem Task-Konstruktor auf.
- asyncio._unregister_task(task)¶
Hebt die Registrierung einer Task aus den internen asyncio-Strukturen auf.
Die Funktion sollte aufgerufen werden, wenn eine Task kurz vor dem Abschluss steht.
- asyncio._enter_task(loop, task)¶
Schaltet die aktuelle Task auf die Task im Argument um.
Rufen Sie die Funktion direkt vor der Ausführung eines Teils einer eingebetteten Coroutine (
coroutine.send()odercoroutine.throw()) auf.
- asyncio._leave_task(loop, task)¶
Schaltet die aktuelle Task von task zurück auf
None.Rufen Sie die Funktion direkt nach der Ausführung von
coroutine.send()odercoroutine.throw()auf.