파이썬에서 멀티 프로세싱 프로그램을 디버깅하는 좋은 방법은 무엇입니까?
답변
진정한 멀티 프로세싱 파이썬 프로그램 ( 두려운 GIL 을 다루어야하는 멀티 스레드 파이썬 프로그램 과 달리 )은 다른 언어의 프로그램과 다르지 않습니다. 그들은 모두 동일한 기본 과제를 가지고 있습니다.
- 작업 할당 및 결과보고. 이들이 독립적 인 데이터 세트를 주로 작업하고 있더라도 결과를보고하고 새로운 데이터가 작동 하도록하려면 일반적으로 마스터 스레드 로 돌아 가야 합니다. 이것은 질식 점이 될 수 있습니다.
- 경쟁 조건. 프로세스는 한 번에 하나의 리소스를 사용하려고하므로 서로의 데이터 전체에 스테핑하지 않도록 뮤텍스 (또는 이와 유사한 것)를 사용해야합니다. 이러한 종류의 리소스를 보호하지 못하면 실제로 매우 고통스러운 디버그 세션 이 발생할 수 있습니다 .
- 순차. 때로는 평행하지 않은 것을 만들려고합니다. 다양한 프로세스는 서로가 무언가를하기를 기다리고 결국 모든 의도와 목적에 따라 순차적 인 프로그램을 가져 와서 병렬로 만들고 선형 시간 (또는 더 나쁜)으로 실행하게됩니다.
이러한 각 문제를 피하려고하는 개발 방법이 있지만 하루가 끝나면 실제로하고있는 일에 대해 생각해야합니다. 나는 추천 무거운 스트레스 테스트를 – 지금까지 당신이 실제 생활에서 일어날 것 같아 아무 이상 – 당신은 기회의 그 윈도우 타격 및 주요 데모 또는 생산시 중간에 반대로 개발에 날려의 좋은 기회가 그래서.
우리는 마이크로 – 타임 스탬프 로그 파일을 사용하는 데 사용하고 우리가 할 수 있도록 다음 색상으로 구분 로그보기 응용 프로그램을 만들 려고 M 프로세서에서 실행되는 N 공정 사이에 무슨 일이 일어 났는지 시각화 할 수 있습니다. 또한 충돌의 상황을 재현하기 위해 로그 파일을 제거하는 시스템을 만들려고 노력했습니다.
그러나 가장 좋은 도구는 좋은 디자인이며 실제로 앱을 물 밖으로 날려 버리는 악하고 불쾌한 사람들입니다. (안녕하세요!)
답변
내가 매우 유용하다고 생각하는 것 중 하나는 multiprocessing
모듈 에서 기존 로거를 사용하는 것 입니다. 메인 코드에서 이것을 시도하십시오 :
import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)
참조 : http://docs.python.org/library/multiprocessing.html#logging
또한 다음을 사용하여 현재 프로세스 이름에 액세스 할 수 있습니다.
cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))
참조 : http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process
그 외에도 나는 pdb
& co 와 같은 표준 디버깅 방법을 제외하고는 아무것도 모른다 .