그래서 두 개의 파이썬 스크립트가 있습니다. 첫 번째는 수천 개의 파일을 스캔하는 파서이고 두 번째는 수백 개의 개별 디렉토리에서 스캔을 수행하는 스케줄러입니다. 내 문제는 다음과 같습니다.파이썬 : 다중 프로세스 풀에서 강제 num 프로세스
디스크 리소스가 제한되어 있고 각 스캔에서 약 1GB의 로컬 sqlite3 저장소를 사용합니다. 최대 프로세스 수를 실행하는 동안 디스크 I/O 오류가 발생하지 않도록 프로세스 수를 제한해야합니다.
다음 코드를 사용하여 스캔을 포크하고 프로세스를 8로 유지하려고 시도했지만 내 임시 디렉토리 (임시 로컬 파일이 저장된 위치)를 볼 때 실질적으로 8 개 이상의 파일이 내 위치를 표시합니다 나는 프로세스를 적절하게 제한하지 않고있다 (스캔이 끝난 후 임시 파일을 제거하기 위해 os.remove를 사용한다).
이것은 단지 잘 포맷 명령
def execute_scan(cmd):
try:
log("Executing "+ str(cmd))
subprocess.call(cmd, shell=False)
except Exception as e:
log(e)
log(cmd)
이 getCommand은 (OBJ) 명령 배열 오브젝트 데이터 변환 내 주요 방법에 가지는 프로세스를 만들어 낸다 내 실행 주사 방법 .
tasks = [getCommand(obj) for obj in scanQueue if getCommand(obj) is not None]
multiprocessing.Pool(NUM_PROCS).map(execute_scan, tasks)
나는 많은 데이터와 디스크를 다루고 있기 때문에 얻을 수있는 조언을 사용할 수 있습니다.
고맙습니다.
[I/O 바인딩 된 작업을 병렬 처리하면 단일 스레드 (또는 프로세스)에서 작업을 실행하는 것보다 런타임이 짧아집니다.] (http://stackoverflow.com/a/20421535/1595865) . 다중 스레드 또는 프로세스를 사용하면 CPU 바운드 작업을 처리 할 때 유용합니다 (매회가 아닌 경우도 마찬가지 임) – goncalopp
임시 파일을 제거하는 코드는 표시하지 않았지만 문제가있는 곳일 수 있습니다. 간접적으로 실행중인 프로세스의 수를 간접적으로 추측하기 위해 임시 파일을 보는 것은 이상한 일입니다 .---- OS 도구를 사용하여 프로세스의 수를 직접 계산하십시오. 'Pool (NUM_PROCS)'는 * 정확히 *'NUM_PROCS' 프로세스를 생성합니다. –
@TimPeters 설명에서 언급했듯이 os.remove (경로)를 사용하여 임시 파일을 제거하면 해당 부분이 올바르게 작동합니다. – onetwopunch