2016-10-06 3 views
2

멀티 프로세싱을 사용하여 실행 시간을 향상 시켰지만 PC의 동작이 올바른지 여부를 알지 못했지만 모든 프로세스가 완료 될 때까지 시스템이 정지되었습니다. Windows 7과 Python 2.7을 사용하고 있습니다. 멀티 프로세싱 동결 컴퓨터

은 아마 내가 여기, 실수를하고있는 중이 야 것은 내가 무슨 짓을 : 여기

def do_big_calculation(sub_list, b, c): 
    # do some calculations here with the sub_list 

if __name__ == '__main__': 
    list = [[1,2,3,4], [5,6,7,8], [9,10,11,12]] 
    jobs = [] 
    for sub_l in list : 
     j = multiprocessing.Process(target=do_big_calculation, args=(sub_l, b, c)) 
     jobs.append(j) 
    for j in jobs: 
     j.start() 

답변

2

, 당신은 작업 당 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에서이 고정되었습니다. 따라서 버그 수정 및 개선이 상대적으로 빈번합니다.
또한 계산을위한 오버 헤드를 줄이기 위해 영리한 도구를 구현합니다. 예를 들어, 큰 수의 배열에 대해 메모리 매핑을 사용합니다 (모든 작업 시작의 메모리 사용 공간을 줄입니다).

+0

밤새 테스트를 거쳤으며 매력적으로 작동합니다! 타사 라이브러리를 사용하면 어떤 이점이 있습니까? – snowflake

+1

'joblib'은 메모리 매핑을 사용하여 작업에 대한 영리한 스케줄링과 큰 numpy 어레이에 대한 최적화 된 공유를 포함합니다. 이렇게하면 프로세스 관리로 인한 오버 헤드를 줄일 수 있습니다. 'multiprocessing.Pool'에는 약간의 버그 (특히 크로스 플레이트 프로젝트의 경우)가 있지만 기본적인 다중 처리의 경우에는 잘 작동하는 버그가 있습니다. –