10

GUIコードの一部に、単純な生産者と消費者のパターンを設定しました。特定の消費者セクションだけをプロファイリングして、最適化の可能性があるかどうかを確認しようとしています. ただし、コードを実行しようとすると、python -m cProfile -o out.txt myscript.pyPython のpickleモジュールからエラーがスローされます。

  File "<string>", line 1, in <module>
  File "c:\python27\lib\multiprocessing\forking.py", line 374, in main
    self = load(from_parent)
  File "c:\python27\lib\pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "c:\python27\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "c:\python27\lib\pickle.py", line 880, in load_eof
    raise EOFError
EOFError

コードの基本パターンは

class MyProcess(multiprocessing.Process):
    def __init__(self, in_queue, msg_queue):
        multiprocessing.Process.__init__(self)
        self.in_queue = in_queue
        self.ext_msg_queue = msg_queue
        self.name == multiprocessing.current_process().name

    def run(self):
        ## Do Stuff with the queued items

これは通常、GUI 側からタスクが供給されますが、テスト目的で、次のように設定しました。

if __name__ == '__main__':

    queue = multiprocessing.Queue()
    meg_queue = multiprocessing.Queue()
    p = Grabber(queue)
    p.daemon = True
    p.start()
    time.sleep(20)
    p.join()

しかし、スクリプトを開始しようとすると、上記のエラー メッセージが表示されます。

エラーを回避する方法はありますか?

4

1 に答える 1

9

私の理解では、モジュールはコマンドラインではcProfileうまく機能しません。multiprocessing( Python マルチプロセス プロファイリングを参照してください。)

これを回避する 1 つの方法は、コード内からプロファイラーを実行することです。特に、プール内のプロセスごとに異なるプロファイラー出力ファイルを設定する必要があります。を呼び出すことで、これを非常に簡単に行うことができますcProfile.runctx('a+b', globals(), locals(), 'profile-%s.out' % process_name)

http://docs.python.org/2/library/profile.html#module-cProfile

于 2013-08-09T15:30:30.467 に答える