2013-08-09 15 views
6

私はguiコードの一部にシンプルなプロデューサコンシューマパターンを設定しました。私は最適化のチャンスがあるかどうかを見るために特定の消費者セクションだけをプロファイルしようとしています。しかし、python -m cProfile -o out.txt myscript.pyでコードを実行しようとすると、Pythonのpickleモジュールから投げられたエラーが発生します。マルチプロセッシングを使用するPythonコードのプロファイリング?

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 

コード内の基本的なパターンは、これは通常、物事のGUI側からタスクを与えているが、次のようにテスト目的のために、私はそれを設定

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 

です。

if __name__ == '__main__': 

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

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

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

答えて

3

cProfileモジュールは、コマンドラインでmultiprocessingとうまく動作しません。 (Python multiprocess profilingを参照してください)

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

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

関連する問題