Использование браузера профиля памяти Heapy с Twisted.web - PullRequest
8 голосов
/ 26 августа 2009

Я пытаюсь профилировать искаженный код Python с Heapy . Например (псевдокод):

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()

Что нужно сделать, чтобы просмотреть результаты профиля Heapy в браузере профиля ?

1 Ответ

6 голосов
/ 24 сентября 2009

Просмотрев сайт гуппи и не найдя никакой информации о том, как запустить там браузер профилей, я начал искать источник гуппи и в конце концов нашел guppy / heapy / Prof.py, в конце которого я увидел строку документации содержащие эту строку:

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

Затем, вспомнив, что я видел документацию, в которой указан тип возвращаемого значения guppy.hpy как «Использовать», я проверил, будет ли guppy.hpy (). Pb () что-нибудь делать. И действительно, это так. Похоже, именно так запускается браузер профилировщика. Я не уверен, что это то, о чем вы спрашивали, но мне нужно было разобраться, прежде чем я смогу ответить на другую возможную часть вашего вопроса. :)

Кажется, самый простой способ сделать эту информацию доступной - сделать ресурс на вашем веб-сервере, который вызывает Use.pb в процессе рендеринга. Есть и другие подходы, такие как встраивание люка в ваше приложение или использование обработчика сигнала для его запуска, но мне нравится идея ресурса. Так, например:

class ProfileBrowser(Resource):
    def render_GET(self, request):
        h.pb()
        return "You saw it, right?"

...
root = RootResource(mq)
root.putChild("profile-browser", ProfileBrowser())
...

Затем вы можете посетить / profile-browser, когда захотите посмотреть в браузере профилей. Вызов "pb" блокируется до тех пор, пока браузер профиля не выйдет (обратите внимание, что простое закрытие окна с помощью кнопки wm destroy не вызывает его возврата - кажется, только пункт меню выхода), поэтому ваш сервер зависает до тех пор, пока вы не закроете окно, но для целей отладки может показаться, что это нормально.

...