Wenn beispielsweise eine Anwendung from twisted.internet import reactor
und eine andere Anwendung dasselbe tut, sind diese reactors
gleich?
Ich frage, weil Deluge , eine Anwendung, die verdreht verwendet, sieht aus wie es den Reaktor verwendet, um ihre UI (gtk) zu verbinden Der Rest der Anwendung wird von Twist getrieben (ich versuche die Quelle zu verstehen). Wenn die Benutzeroberfläche beispielsweise geschlossen wird, ruft sie einfach reactor.stop()
auf.
Ist das alles da? Es scheint mir eine Art Magie zu sein. Was, wenn ich eine andere Anwendung ausführen möchte, die verdreht verwendet?
Ja, jedes Modul in Python ist immer global, oder besser gesagt, ein Singleton: Wenn Sie from twisted.internet import reactor
ausführen, prüft Pythons Importmechanismus zuerst sys.modules['twisted.internet.reactor']
und gibt, falls vorhanden, diesen Wert zurück; Nur wenn es nicht existiert (d. h. das erste Mal, wenn ein Modul importiert wird), wird das Modul zum ersten Mal tatsächlich geladen (und in einem Eintrag in sys.modules
für mögliche zukünftige Importe gespeichert).
Es gibt nichts besonders Magisches im Singleton-Entwurfsmuster, obwohl es manchmal einschränkend sein kann, wenn Sie verzweifelt mehr als eine jener Dinger brauchen, für die die Architektur verordnet hat "es kann nur einen geben". Twisteds Dokumente bestätigen das:
Neuer Anwendungscode sollte es vorziehen übergeben und akzeptieren Sie den Reaktor als Parameter, wo es benötigt wird, eher als darauf angewiesen zu sein, importieren zu können Dieses Modul, um eine Referenz zu bekommen. Dies vereinfacht das Gerätetesten und kann es machen es ist einfacher, einen Tag mehrere zu unterstützen Reaktoren (als Leistung Verbesserung), obwohl dies nicht ist derzeit möglich.
Der beste Weg, wenn es für Ihre App von entscheidender Bedeutung ist, besteht darin, einen Beitrag zum Twisted-Projekt zu leisten, entweder Arbeit (die subtilen Mechanismen zur Unterstützung mehrerer Reaktoren, dh mehrere Ereignisschleifen innerhalb einer einzigen App) ) oder Finanzierung (Geld wird es ermöglichen, jemanden mit einem Stipendium zu unterstützen, um diese Arbeit auszuführen).
Verwenden Sie andernfalls separate Prozesse (z. B. mit dem Modul multiprocessing
der Standardbibliothek) mit jeweils nicht mehr als einem Reaktor.
Tags und Links python networking reactor twisted