2013-08-09 6 views
6

내 gui 코드의 일부로 간단한 제작자 소비자 패턴을 설정했습니다. 나는 최적화를위한 어떤 기회가 있는지보기 위해 특정 소비자 섹션을 프로파일 링하려고 시도하고있다. 그러나 python -m cProfile -o out.txt myscript.py 코드를 실행하려고하면 파이썬의 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 

코드의 기본 패턴이 일반적으로 사물의 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

관련 문제