在Twisted.web中使用Heapy的内存分析器

8 投票
1 回答
3039 浏览
提问于 2025-04-15 13:52

我正在尝试用Heapy来分析我的Twisted 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()

我需要做些什么才能在分析浏览器中查看Heapy的分析结果呢?

1 个回答

7

我在查看guppy网站时,没有找到关于如何启动配置文件浏览器的信息,于是我开始查看guppy的源代码,最终找到了guppy/heapy/Prof.py。在文件的末尾,我看到了一段文档字符串,其中有这么一句:

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

然后,我记得看到一些文档提到guppy.hpy的返回类型是Use,于是我检查了一下guppy.hpy().pb()是否有用。结果,确实有用。所以这似乎就是启动配置文件浏览器的方法。我不确定这是不是你想问的,但我需要弄清楚这个问题,才能回答你其他可能的问题。:)

看起来,最简单的方式是创建一个资源,在你的网络服务器中调用Use.pb作为渲染过程的一部分。还有其他方法,比如在你的应用程序中嵌入一个manhole,或者使用信号处理器来触发它,但我更喜欢资源的想法。所以,比如说:

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"调用会一直阻塞,直到你退出配置文件浏览器(注意,仅仅用窗口的关闭按钮关闭窗口似乎不会让它返回,只有选择退出菜单项才行),所以在你关闭窗口之前,服务器会一直处于挂起状态,但对于调试来说,这似乎是可以接受的。

撰写回答