2009-08-25 56 views
8

我想與Heapy配置扭曲的python代碼。例如(僞代碼):使用Heapy的內存配置文件瀏覽器與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() 

什麼我需要做的,以查看在profile browser Heapy輪廓的結果嗎?

回答

6

在看過guppy網站並沒有找到任何有關如何啓動配置文件瀏覽器的信息後,我開始環顧guppy源代碼並最終找到了guppy/heapy/Prof.py,最後我看到了文檔字符串包含此行:

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

然後,記住,我有看到一些文件給guppy.hpy作爲使用的返回類型,我檢查,看看是否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文件瀏覽器,每當你想看看配置文件瀏覽器。直到配置文件瀏覽器退出時,「pb」呼叫纔會被阻止(注意,只需用wm destroy按鈕關閉窗口似乎不會導致它返回 - 只有退出菜單項似乎),因此服務器一直處於掛起狀態,直到您解除該窗口,但爲了調試的目的,似乎可能是好的。

+0

你在哪裏實例化h?或者更具體地說,如果我使用twistd運行它,那麼我會在何處實例化h? – 2013-09-06 07:20:02

+0

我剛剛從問題中重新使用了'h'變量 - 其中所有的代碼都在同一個模塊中,'h'是在反應堆啓動之前全局實例化的。這對於真實世界的代碼當然不是理想的實踐。您可能想要在應用程序中的某個重要類的__init__中實例化'hpy'並將其保存爲屬性。另一個想法是在tac文件中實例化它並將其附加到應用程序對象。 – 2013-09-06 11:02:23