2013-12-09 4 views
0

그래서 두 개의 파이썬 스크립트가 있습니다. 첫 번째는 수천 개의 파일을 스캔하는 파서이고 두 번째는 수백 개의 개별 디렉토리에서 스캔을 수행하는 스케줄러입니다. 내 문제는 다음과 같습니다.파이썬 : 다중 프로세스 풀에서 강제 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) 

나는 많은 데이터와 디스크를 다루고 있기 때문에 얻을 수있는 조언을 사용할 수 있습니다.

고맙습니다.

+1

[I/O 바인딩 된 작업을 병렬 처리하면 단일 스레드 (또는 프로세스)에서 작업을 실행하는 것보다 런타임이 짧아집니다.] (http://stackoverflow.com/a/20421535/1595865) . 다중 스레드 또는 프로세스를 사용하면 CPU 바운드 작업을 처리 할 때 유용합니다 (매회가 아닌 경우도 마찬가지 임) – goncalopp

+0

임시 파일을 제거하는 코드는 표시하지 않았지만 문제가있는 곳일 수 있습니다. 간접적으로 실행중인 프로세스의 수를 간접적으로 추측하기 위해 임시 파일을 보는 것은 이상한 일입니다 .---- OS 도구를 사용하여 프로세스의 수를 직접 계산하십시오. 'Pool (NUM_PROCS)'는 * 정확히 *'NUM_PROCS' 프로세스를 생성합니다. –

+0

@TimPeters 설명에서 언급했듯이 os.remove (경로)를 사용하여 임시 파일을 제거하면 해당 부분이 올바르게 작동합니다. – onetwopunch

답변

0

의 사용에 대한 간단한 튜토리얼, 그것은 sqlite3를 데이터베이스에 IO가 병목 현상 때문에 멀티가 실제로 둔화 된 것으로 나타났다 goncalopp 예측대로.

0

gevent.pool.Pool은 적절한 해결책 일 수 있습니다. 왜냐하면 gevent는 동시성 작업을 수행하는 데 greenlets를 사용하고 한 번에 하나의 greenlet 만 실행할 수 있기 때문입니다.

상황에 따라 먼저 풀 크기를 적절한 수로 설정합니다. 즉, 몇 개의 I/O 작업을 수행 할 수있는 최대 수의 녹색 알레토가 있음을 의미합니다. 그런 다음 스캔 작업을 수행하는 기능을 미성년자에게 돌려서 허브 그린 렛으로 예약 할 풀에 추가하십시오. 여기

내가 아마이 응용 프로그램에 멀티를 사용할 수도 있지만 gevent.pool.Pool

관련 문제