2014-10-31 3 views
2

함수 및 상대 인수 목록에서 해당 작업을 병렬 처리하기 위해 최대한 많은 프로세스를 시작하는 함수를 만들고 싶습니다. 실행중인 프로세스의 수는 CPU의 코어 수를 초과 할 수 없습니다. 프로세스가 완료되면 끝날 때까지 다른 프로세스로 교체해야합니다.여러 CPU 환경에서 함수의 대량 병렬 처리

저는 파이썬 풀을 사용하여 그런 것을 구현하려고했습니다. 여기 내 기능은 다음과 같습니다.

from multiprocessing import Pool, cpu_count 

CPUS = cpu_count() 

def parallelize(functions, args): 
    results = [] 
    if CPUS > 1: 
     for i in xrange(0, len(functions), CPUS): 
      pool = Pool() 
      for j in xrange(CPUS): 
       if i + j >= len(functions): 
        break 
       results.append(pool.apply_async(functions[i + j], args = args[i + j])) 
      pool.close() 
      pool.join() 
     map(lambda x: x.get(), results) 
    else: 
     for i in xrange(len(functions)): 
      results.append(functions[i](*args[i])) 
    return results 

이 구현은 대량으로 함수 목록을 세분합니다. 각 벌크 크기는 실제 CPU 수와 같습니다. 문제는 실제로 각 대량의 함수가 완료 될 때까지 기다린 다음 다시 다른 대량의 프로세스를 시작한다는 것입니다.
대량 동작이 매우 느린 경우 다른 프로세스가 시작되기 전에 다른 CPU가 완료 될 때까지 기다릴 것이므로이 동작을 원하지 않습니다.

올바른 접근 방법은 무엇입니까?

+0

'@dano. 따라서'methods [i + j]'는 하나의 함수입니다. 그게 뭐가 잘못 되었 니? – ProGM

+0

아, 죄송합니다. 나는 그것이 어떤 이유로 슬라이스라고 생각하고있었습니다. 나를 무시해라. – dano

+0

ok 문제 없음 :) – ProGM

답변

2

너무 복잡해 보입니다. multiprocessing.Pool은 작업 항목 수에 상관없이 항상 지정한 프로세스 수만큼 실행됩니다. 따라서 Pool(CPUS)을 만들면 개의 작업을 먹이더라도 은 CPUS 개 이상의 작업을 동시에 실행하지 않습니다. 따라서 특별한 작업을 수행하지 않고 CPU를 사용하는 것보다 더 많은 작업을 절대로 실행하지 않아도된다는 요구 사항을 충족시킵니다. 따라서 메서드 및 args 전체 목록을 반복 할 수 있으며 호출을 일괄 처리하는 것에 대해 걱정하지 않고 apply_async을 호출하면됩니다. Pool 한 번에 모든 작업,하지만 결코 이상 CPUS 작업을 실행합니다 : methods` 함수의 목록입니다

def parallelize(methods, args): 
    results = [] 
    if CPUS > 1: 
     pool = Pool(CPUS) 
     for method, arg in zip(methods, args): 
      results.append(pool.apply_async(method, args=arg)) 
     pool.close() 
     pool.join() 
     out = map(lambda x: x.get(), results) 
    else: 
     for i in xrange(len(methods)): 
      results.append(methods[i](*args[i])) 
    return results 
+0

아, 내가 예상했던 것보다 단순 해. 고맙습니다! – ProGM