Ist twisted.internet.reactor global?

8

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?

    
lightweight 06.08.2010, 14:39
quelle

2 Antworten

13

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.

    
Alex Martelli 06.08.2010, 14:43
quelle
2

Der Reaktor ist tatsächlich global. Es kümmert sich um die Ereignisschleife und Sie registrieren Handler, um Ereignisse zu konsumieren. Wenn Sie mehrere Anwendungen mit demselben Reaktor verwenden möchten, können Sie den Twistd-Daemon verwenden. Ссылка

    
Tommy 06.08.2010 14:50
quelle

Tags und Links