6

Es ist einfach, hoch integrierten Code in Python zu erstellen, so dass die Notwendigkeit, eine Anwendung zu beenden und neu zu starten, wenn der Code geändert wird, verständlich ist.Wie schreibe ich Python-Code, der selbst aktualisiert werden kann, ohne die Anwendung zu beenden?

Allerdings muss es sicherlich einige Strategien und Modelle geben, um Teile des Codes isolieren zu können, so dass er im laufenden Betrieb aktualisiert werden kann, ohne dass er beendet und neu gestartet werden muss.

Für die Anwendungen, die ich an vielen Funktionen arbeite, werden unabhängige Hintergrundaufgaben sein, mit denen die Hauptanwendung sprechen wird, Statusinformationen anzeigen und auch anweisen, Aufgaben basierend auf dem aktuellen Status auszuführen. In vielerlei Hinsicht können diese Hintergrundaufgaben als unabhängige Programme angesehen werden, nur weil sie einige der Codebasis mit der Hauptanwendung und anderen Tools, Tasks usw. gemeinsam nutzen.

Während es wahrscheinlich schwer ist, den ganzen Shebang updatefähig zu machen, bin ich sicher, dass es Wege geben muss, wo es möglich ist, Updates zu veröffentlichen und den laufenden Code zu bemerken und sich selbst zu aktualisieren.

Da ich auch gerne Multithreading und asyncio (in Python 3.5) ausnutzen würde, sowie explorieren, Dinge staatenlos zu machen, scheint es logisch möglich, hier einige interessante Dinge zu tun, die es zumindest möglich machen, einige zu vermeiden Erzwungene Neustarts beim Ausrollen von neuem Code.

Wäre sehr dankbar für Tipps und Hinweise zu Informationen, wie dies funktioniert.

+3

Sie könnten interessiert sein an [diese Frage] (https://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module) – CoryKramer

+0

Dank @CoryKramer, das ist genau die Art von Informationen, die ich suche. Brilliant, das könnte einfacher sein, als ich es mir vorgestellt habe :) – tsvenson

+1

Ich glaube, Flasch und Tornado haben beide Funktionen, also könnt ihr euch auch ihren Code ansehen. – dano

Antwort

2

Es gibt eine eingebaute Funktion reload(), die ein Modul neu lädt, aber es ist leicht zu versauen. Sie müssen sehr vorsichtig sein, was Verweise auf Objekte enthält, die von der alten Version des Moduls erstellt wurden, und müssen diese beim erneuten Laden des Moduls unbedingt ersetzen.

Ich benutze Django sehr oft, und wenn es seinen Web-Server im Debug-Modus ausführt, lädt es den gesamten Webserver-Prozess neu, wenn sich eine Quelldatei ändert. Es ist ein guter Kompromiss zwischen einem manuellen Neustart und dem erneuten Laden eines einzelnen Moduls.

Ich habe es nicht verwendet, aber watchdog kann hilfreich sein, das Dateisystem auf Änderungen zu überwachen, um ein Neuladen auszulösen.

Verwandte Themen