8

ツイスト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プロファイルの結果を表示するにはどうすればよいですか?

4

1 に答える 1

6

guppy の Web サイトを調べた後、そこでプロファイル ブラウザーを起動する方法に関する情報が見つからなかったので、guppy のソースを調べ始め、最終的に guppy/heapy/Prof.py を見つけました。その最後に、この行を含む docstring を見つけました。 :

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

次に、guppy.hpy の戻り値の型を Use として指定しているドキュメントを見たことを思い出して、guppy.hpy().pb() が何かを実行するかどうかを確認しました。そして、確かにそうです。これが、プロファイラー ブラウザーの起動方法のようです。これがあなたが求めていたものかどうかはわかりませんが、あなたの質問の他の可能性のある部分に答える前に、それを理解する必要がありました. :)

この情報を利用できるようにする最も簡単な方法は、レンダリング プロセスの一部として Use.pb を呼び出す Web サーバーのリソースを作成することです。アプリケーションにマンホールを埋め込んだり、シグナル ハンドラーを使用してそれをトリガーしたりするなど、他のアプローチもありますが、私はリソースのアイデアが気に入っています。たとえば、次のようになります。

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 ボタンでウィンドウを閉じるだけでは復帰しないようです。終了メニュー項目のみが復帰するようです)。そのため、終了するまでサーバーがハングします。ウィンドウですが、デバッグ目的では問題ないようです。

于 2009-09-24T15:18:55.563 に答える