0

多くのワーカースレッド、アイドルイベントサイクル、およびCPUを消費する可能性のある他の多くのイベント処理コードを含むwxPythonアプリがあります。今のところ、アプリが操作されていないときは、約8〜10%のCPUを消費します。

質問:

アプリのどの部分/スレッドが最もCPUを消費しているかを知ることができるツールはありますか?そのような一般的なツールがない場合、私はあなたがそのようなシナリオに取り組むために通常取るアプローチを知りたいですか?例:アプリの一部の無効化、トレースなど

編集:私の質問の言語があいまいである可能性があります。プロファイラーを使用できるため、コード内のどの関数またはコードブロックがほとんどのリソースを使用しているかを知りたくありません。私が知りたいのは、アプリを実行したときのCPU使用率が8〜10%であることがわかりましたが、アプリのスレッドがその10%CPUを使用しているさまざまな部分を知る方法はありますか?基本的にその瞬間、コードのどの部分が実行されているのか知りたいですか?

4

4 に答える 4

1

すべてのスレッドに固有の開始メソッドがある場合は、Pythonに付属のプロファイラーを使用できます。

Macを使用している場合は、Instrumentsアプリを確認する必要があります。Linux用のdtraceを使用することもできます。

于 2009-09-24T09:00:50.013 に答える
0

これは、言語に依存しないレベルではあまり実用的ではありません。言語を取り除いてください。残っているのは、システムコールが散りばめられた大量のマシンコード命令だけです。Linuxではstraceを使用し、WindowsではProcessExplorerを使用して、これらのシステムコールから何が起こっているかを推測することができますが、プロファイラーを使用する方がはるかに理にかなっています。言語にアクセスできる場合は、さまざまなことができます(追加のロギング、デバッガーでのランダムな一時停止)が、その状況でもプロファイラーが最適なツールです。

于 2009-09-24T09:51:32.807 に答える
0

私はPythonトレースモジュールの変更されたバージョンを書くことで問題を解決することができます。これは無効にできます。基本的にはTrace次のようなクラスを変更します。

import sys
import trace

class MyTrace(trace.Trace):
    def __init__(self, *args, **kwargs):
        trace.Trace.__init__(self, *args, **kwargs)
        self.enabled = False

    def localtrace_trace_and_count(self, *args, **kwargs):
        if not self.enabled:
            return None 
        return trace.Trace.localtrace_trace_and_count(self, *args, **kwargs)

tracer = MyTrace(ignoredirs=[sys.prefix, sys.exec_prefix],)

def main():
    a = 1
    tracer.enabled = True
    a = 2
    tracer.enabled = False
    a = 3

# run the new command using the given tracer
tracer.run('main()')

出力:

 --- modulename: untitled-2, funcname: main
untitled-2.py(19):     a = 2
untitled-2.py(20):     tracer.enabled = False

重要なポイントで有効にすると、どのコードステートメントが最も実行されているかを1行ずつ追跡するのに役立ちます。

于 2009-09-24T10:38:28.577 に答える
0

Windows XP以降では、Process Explorerにすべてのプロセスが表示され、各プロセスのプロパティを表示したり、開いているスレッドを表示したりできます。スレッドID、開始時間、状態、カーネル時間、ユーザー時間などが表示されます。

于 2009-10-22T16:35:43.760 に答える