【问题标题】:Using Heapy's Memory Profile Browser with Twisted.web将 Heapy 的内存配置文件浏览器与 Twisted.web 一起使用
【发布时间】:2010-11-22 19:49:29
【问题描述】:

我正在尝试使用 Heapy 分析扭曲的 Python 代码。例如(伪代码):

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

我需要做什么才能在 profile browser 中查看 Heapy 配置文件结果?

【问题讨论】:

    标签: python profiling heap-memory twisted heapy


    【解决方案1】:

    在查看了 guppy 网站并没有找到任何关于如何在那里启动配置文件浏览器的信息后,我开始查看 guppy 源代码并最终找到 guppy/heapy/Prof.py,在其末尾我看到了一个文档字符串包含这一行:

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

    然后,记得我曾看到一些文档将 guppy.hpy 的返回类型作为 Use,我检查了 guppy.hpy().pb() 是否会做任何事情。而且,确实如此。所以这似乎是探查器浏览器的启动方式。我不确定这是否是您要问的,但我需要先弄清楚,然后才能回答您问题的其他可能部分。 :)

    似乎使这些信息可用的最简单方法是在您的 Web 服务器中创建一个资源,该资源调用 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 按钮关闭窗口似乎不会导致它返回 - 只有退出菜单项似乎)所以你的服务器被挂起,直到你关闭窗口,但出于调试目的,这似乎没问题。

    【讨论】:

    • 你在哪里实例化了 h?或者更具体地说,如果我使用 twistd 运行它,我应该在哪里实例化 h?
    • 我刚刚重新使用了问题中的h 变量——所有代码都在同一个模块中,h 是在反应器启动之前实例化的全局变量。对于现实世界的代码,这当然不是理想的做法。您可能想做一些事情,例如在应用程序中的一个重要类的 __init__ 中实例化 hpy 并将其保存为属性。另一个想法是在 tac 文件中实例化它并将其附加到应用程序对象。
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2019-06-28
    • 2012-05-23
    • 1970-01-01
    • 2013-08-17
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多