2009-08-25 7 views
8

Ich versuche, Twisted Python-Code mit Heapy Profil. Zum Beispiel (Pseudocode):Verwenden von Heapy Memory Profile Browser mit Twisted.web

from twisted.web import resource, server 
from twisted.internet import reactor 
from guppy import hpy 

class RootResource(resource.Resource): 
    render_GET(self, path, request): 
     return "Hello World" 

if __name__ == '__main__': 
    h = hpy() 
    port = 8080 
    site = server.Site(RootResource(mq)) 
    reactor.listenTCP(port, site) 
    reactor.run() 

Was muß ich tun Heapy Profil Ergebnisse in den profile browser zu sehen?

Antwort

6

Nachdem ich über die Guppy-Website geschaut habe und keine Informationen darüber gefunden habe, wie ich den Profil-Browser starten soll, habe ich mich um die Guppy-Quelle gekümmert und schließlich Guppy/Heapy/Profpy gefunden, an deren Ende ich eine gesehen habe Docstring enthält die folgende Zeile:

[0] heapy_Use.html#heapykinds.Use.pb 

Dann erinnern, dass ich eine Dokumentation hatte den Rückgabetyp von guppy.hpy als Verwendung zu geben, überprüfte ich, wenn guppy.hpy() pb() zu sehen, würde alles tun.. Und tatsächlich tut es das. So scheint es zu sein, wie der Profiler-Browser gestartet wird. Ich bin mir nicht sicher, ob Sie das fragen, aber ich musste es herausfinden, bevor ich den anderen möglichen Teil Ihrer Frage beantworten konnte. :)

Es scheint die einfachste Möglichkeit, diese Informationen zur Verfügung zu stellen, wäre eine Ressource in Ihrem Webserver, der Use.pb als Teil seines Renderprozesses aufruft. Es gibt andere Ansätze, z. B. das Einbetten eines Einstiegslochs in Ihre Anwendung oder das Verwenden eines Signal-Handlers, um es auszulösen, aber ich mag die Ressourcen-Idee. So zum Beispiel:

Dann können Sie/Profil-Browser besuchen, wann immer Sie den Profil-Browser anzeigen möchten. Der "pb" -Aufruf blockt, bis der Profilbrowser beendet wird (beachte, dass das Schließen des Fensters mit der wm destroy-Taste nicht dazu führt, dass es zurückkehrt - nur der Exit-Menüpunkt scheint), so dass Ihr Server hängt, bis Sie ihn schließen das Fenster, aber für Debugging-Zwecke, die scheint, wie es in Ordnung sein kann.

+0

wo haben Sie h instanziiert? Oder genauer, wo instanziiere ich h, wenn ich es mit twisted benutze? –

+0

Ich habe die 'h' -Variable aus der Frage einfach wieder verwendet - wo sich der gesamte Code im selben Modul befindet und' h' ist ein globales Exemplar, bevor der Reaktor gestartet wird. Dies ist sicherlich keine ideale Praxis für echten Code. Vielleicht möchten Sie etwas wie "hpy" in das "__init__" einer der wichtigen Klassen in Ihrer Anwendung instanziieren und es als Attribut speichern. Eine andere Idee besteht darin, sie in einer tac-Datei zu instanziieren und sie an das Anwendungsobjekt anzuhängen. –