, 당신은 작업 당 1 Process
을 만들 수 있습니다. 이것은 모든 작업을 병렬로 실행하지만 스케줄러가 많은 프로세스를 관리해야하므로 컴퓨터에 많은 부담을줍니다. 프로그램에 너무 많은 자원이 사용되면 시스템이 정지 될 수 있습니다. 당신은 타사 라이브러리를 사용할 준비가되면
import multiprocessing as mp
def do_big_calculation(args):
sub_list, b, c = args
return 1
if __name__ == '__main__':
b, c = 1, 1
ll = [([1, 2, 3, 4], b, c),
([5, 6, 7, 8], b, c),
([9, 10, 11, 12], b, c)]
pool = mp.Pool(4)
result = pool.map(do_big_calculation, ll)
pool.terminate()
print(result)
, 당신은 또한 concurrent.futures
을 살펴 수 :
해결책은 여기 동시에 몇 가지 작업을 수행하는 프로세스의 주어진 수를 실행하는 multiprocessing.Pool
을 사용할 수 (당신은 python2.7에 설치해야하지만 python3.4의 + 존재) (PIP 사용 가능) 또는 joblib
:
from joblib import Parallel, delayed
def do_big_calculation(sub_list, b, c):
return 1
if __name__ == '__main__':
b, c = 1, 1
ll = [([1, 2, 3, 4], b, c),
([5, 6, 7, 8], b, c),
([9, 10, 11, 12], b, c)]
result = Parallel(n_jobs=-1)(
delayed(do_big_calculation)(l, b, c) for l in ll)
print(result)
같은 라이브러리의 주요 장점은 0,123,590,194 반면 개발하고 있다는 것입니다 Python2.7에서이 고정되었습니다. 따라서 버그 수정 및 개선이 상대적으로 빈번합니다.
또한 계산을위한 오버 헤드를 줄이기 위해 영리한 도구를 구현합니다. 예를 들어, 큰 수의 배열에 대해 메모리 매핑을 사용합니다 (모든 작업 시작의 메모리 사용 공간을 줄입니다).
밤새 테스트를 거쳤으며 매력적으로 작동합니다! 타사 라이브러리를 사용하면 어떤 이점이 있습니까? – snowflake
'joblib'은 메모리 매핑을 사용하여 작업에 대한 영리한 스케줄링과 큰 numpy 어레이에 대한 최적화 된 공유를 포함합니다. 이렇게하면 프로세스 관리로 인한 오버 헤드를 줄일 수 있습니다. 'multiprocessing.Pool'에는 약간의 버그 (특히 크로스 플레이트 프로젝트의 경우)가 있지만 기본적인 다중 처리의 경우에는 잘 작동하는 버그가 있습니다. –