함수 및 상대 인수 목록에서 해당 작업을 병렬 처리하기 위해 최대한 많은 프로세스를 시작하는 함수를 만들고 싶습니다. 실행중인 프로세스의 수는 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가 완료 될 때까지 기다릴 것이므로이 동작을 원하지 않습니다.
올바른 접근 방법은 무엇입니까?
'@dano. 따라서'methods [i + j]'는 하나의 함수입니다. 그게 뭐가 잘못 되었 니? – ProGM
아, 죄송합니다. 나는 그것이 어떤 이유로 슬라이스라고 생각하고있었습니다. 나를 무시해라. – dano
ok 문제 없음 :) – ProGM