2009-08-26 2 views
0

나는 새로운 서브 디렉토리를위한 디렉토리를 감시하고 루프의 각 서브 디렉토리에서 작동하는 파이썬 스크립트를 작성했습니다. 이러한 하위 디렉토리를 만드는 외부 프로세스가 있습니다. 각 하위 디렉토리에는 텍스트 파일과 여러 이미지가 있습니다. 각 이미지의 텍스트 파일에는 하나의 레코드 (줄)가 있습니다. 각 하위 디렉토리에 대해 내 스크립트는 텍스트 파일을 스캔 한 다음 몇 개의 외부 프로그램을 호출하고 빈 이미지 (사용자 정의 exe)를 감지 한 다음 이미지를 크기를 변경하고 마지막으로 7을 호출하는 "mogrify"(ImageMagick의 일부) 호출을 감지합니다 -zip 변환 된 모든 이미지와 텍스트 파일을 하나의 아카이브로 압축합니다.Windows에서 일괄 파일/변환 작업을위한 파이썬 다중 처리

스크립트는 정상적으로 실행되지만 현재 순차적입니다. 각 하위 디렉토리를 한 번에 하나씩 반복합니다. 듀얼 CPU 머신 (총 8 코어)에서 실행되기 때문에 멀티 프로세싱을 할 수있는 좋은 기회라고 생각됩니다.

주어진 하위 디렉토리의 처리는 다른 모든 항목과 독립적입니다 ... 자체 포함되어 있습니다.

현재 os.listdir() 호출을 사용하여 하위 목록을 만든 다음 해당 목록을 반복합니다. 하위 디렉토리 코드 (변환 등)를 모두 별도의 함수로 옮기고 각 하위 디렉토리를 처리하는 별도의 프로세스를 만들 수 있다고 생각했습니다. 필자는 파이썬에 대해 약간 새로운 점이있어 그러한 멀티 프로세싱에 접근하는 방법에 대한 몇 가지 제안은 인정 될 것입니다. 나는 Vista x64에서 Python 2.6을 사용하고 있습니다.

답변

0

나는이 디자인이 동시성으로부터 이익을 얻을 수있는 것처럼 들리는 것에 동의한다. the multiprocessing module을보십시오. the threading module을보고 속도를 비교할 수도 있습니다. 멀티 프로세싱과 스레딩의 이점을 얻기 위해 얼마나 많은 코어가 필요한지 정확하게 말하기는 어렵습니다. 그리고 8 코어는 스레딩이 더 빠를 수있는 범위 내에 있습니다 (예, GIL에도 불구하고).

디자인 관점에서 가능한 가장 좋은 방법은 프로세스 간의 상호 작용을 피하는 것입니다. 하나의 중앙 스레드가 프로세스 생성을 트리거하는 이벤트를 찾습니다 (하위 디렉토리 생성이라고 추측합니다). 그런 다음 하위 디렉토리를 처리하는 프로세스를 생성합니다. 거기서부터 스폰 된 프로세스는 다른 프로세스와 상호 작용해서는 안됩니다. 당신의 설명에서 이것이 가능해야하는 것처럼 보입니다.

마지막으로 Python 3.0으로 이동하여 격려의 말을 전하고 싶습니다. 2.x에 ​​머무르는 것에 대해 많은 이야기가 있지만 3.0은 약간의 개선을 이루었습니다. 점점 더 많은 사람들이 Python 3.0으로 이주하기 시작하면서 도구와 지원을받는 것이 더 어려워 질 것입니다.

+0

감사합니다. 프로세스는 독립적입니다. 유일한 다른 문제는 로깅입니다. 처리 중 오류를보고하기 위해 파일 핸들러에 로그를 쓰고 있습니다. 다중 처리 로깅이 복잡 해지는 것 같습니다! 3.0으로 이동하면서 볼 수있는 유일한 문제점은 MS SQL Server에 연결하기 위해 pyodbc를 사용해야한다는 것입니다. 이 모듈은 현재 최대 2.6까지만 지원합니다. –

+1

로깅과 관련하여 매우 기본적인 해결책은 각 프로세스에 대해 별도의 로깅을 수행 한 다음 로그를 병합하는 것입니다. 당신이 sqlserver에 대해 언급했기 때문에 db를 사용하는 것이 좋을 것입니다. sqlite가 마음에 들었을 때의 빠른 테스트를 위해 자연 스럽습니다. – Francesco

+0

로깅을 위해 SQLite를 사용하라는 제안에 +1. – Imagist