AsyncIO in Plugins neu
SmartHomeNG ist eine Thread-basierte Anwendung. Mit Version 3.4 kam eine initiale Unterstützung von asynchronem In- und Output (asyncio) in Python hinzu. Asyncio ist ein Teil der Standard Bibliothek von Python. Mit den ersten Releases gab es noch eine größere Anzahl Änderungen am asyncio API. Seit Python 3.8 hat asyncio einen recht stabilen Zustand erreicht.
Viele der neueren Packages für Python nutzen asyncio. Diese Packages in Plugins zu integrieren ist nicht ohne Haken und Ösen. Im Folgenden sind einige Informationen zusammengestellt, um in einem (tread-basierten) Plugin asyncio zu nutzen.
Methoden des Plugins
Eine Reihe von Methoden eines Plugins werden von außerhalb des Plugins aufgerufen. Diese Aufrufe erfolgen in unterschiedlichen Threads. die Eventloop von asyncio läuft dem gegenüber nur in einem Thread
Methode des Plugins |
Aufruf erfolgt in Thread |
Bemerkungen |
---|---|---|
init() |
Main |
Main Thread von SmartHomeNG |
parse_item() |
Main |
Main Thread von SmartHomeNG |
run() |
PluginWrapper(<Plugin>) |
beim Start von SmartHomeNG |
beliebiger Thread |
bei erneutem Start des Plugins |
|
stop() |
Main |
beim Stop von SmartHomeNG |
beliebiger Thread |
beim Stop des Plugins in anderen Situationen |
|
poll_device() |
ein Thread des Schedulers |
ein Thread aus dem Worker-Pool |
Bemerkung
Der Thread PluginWrapper(<Plugin>) wird nach beenden der run() Methode beendet. Falls ein Plugin einen eigenen Thread benötigt, kann der Thread genutzt werden, indem die run() Methode nicht beendet wird.
Dabei ist darauf zu achten, dass dir run() Methode, falls sie aus anderen Threads aufgerufen wird, normal beendet werden muss.
Asyncio und Threads kombinieren
Bei der Kombination von Threads und asyncio gibt es zwei zu berücksichtigende Übergänge:
Aufruf von IO-Blocking Code in async Co-Routinen
Aufruf von asyncio Code in einem Thread basierte Programm
Eine gut Beschreibung zu den Herausforderungen und Lösungen findet sich in dem Artikel Combining Traditional Thread-Based Code and Asyncio in Python