2017-11-24 6 views
1

파이썬의 다중 처리 모듈에 대해 배우고 있습니다. 내 코드가 모든 CPU 리소스를 사용하도록하고 싶습니다.파이썬 멀티 프로세싱 쿼리

from multiprocessing import Process 
import time 

def work(): 
    for i in range(1000): 
     x=5 
     y=10 
     z=x+y 

if __name__ == '__main__': 
    start1 = time.time() 
    for i in range(100): 
     p=Process(target=work) 
     p.start() 
     p.join() 
    end1=time.time() 
    start = time.time() 
    for i in range(100): 
     work() 
    end=time.time() 
    print(f'With Parallel {end1-start1}') 
    print(f'Without Parallel {end-start}') 

내가 얻을 출력은 이것이다 : 이것은 내가 쓴 코드입니다

With Parallel 0.8802454471588135 
Without Parallel 0.00039649009704589844 

나는 루프의 서로 다른 범위 값을 실험 또는 유일한 일 함수에 있지만 매번없이 인쇄 문을 사용하여 시도 병렬 실행이 빠릅니다. 제가 누락 된 것이 있습니까?

미리 감사드립니다.

+1

은'작업() '함수를 대표 할 수 너무 간단합니다. 귀하의 경우에는 '프로세스'객체의 인스턴스화로 인해 오버 헤드가 발생하고 해당 기능이 작동하지 않는 경우가있을 수 있습니다. – RomanPerekhrest

+0

피드백을주십시오. – georgexsh

답변

3

벤치 마크 방법은 문제가있다 :

for i in range(100): 
    p = Process(target=work) 
    p.start() 
    p.join() 
난 당신이 병렬로 100 개 프로세스를 실행하려는 생각

하지만 Process.join()blocks until process exit, 효과적으로 시리얼에서 실행됩니다. 게다가 CPU 코어 수보다 많은 프로세스를 사용하면 성능이 저하되는 CPU 경합이 높아집니다. 덧붙여서 귀하의 work() 함수가 너무 단순해서 Process 생성의 오버 헤드와 비교됩니다.

더 나은 버전 :

import multiprocessing 
import time 


def work(): 
    for i in range(2000000): 
     pow(i, 10) 

n_processes = multiprocessing.cpu_count() # 8 
total_runs = n_processes * 4 
ps = [] 
n = total_runs 

start1 = time.time() 
while n: 
    # ensure processes number limit 
    ps = [p for p in ps if p.is_alive()] 
    if len(ps) < n_processes: 
     p = multiprocessing.Process(target=work) 
     p.start() 
     ps.append(p) 
     n = n-1 
    else: 
     time.sleep(0.01) 
# wait for all processes to finish 
while any(p.is_alive() for p in ps): 
    time.sleep(0.01) 
end1=time.time() 

start = time.time() 
for i in range(total_runs): 
    work() 
end=time.time() 

print(f'With Parallel {end1-start1:.4f}s') 
print(f'Without Parallel {end-start:.4f}s') 
print(f'Acceleration factor {(end-start)/(end1-start1):.2f}') 

결과 :

With Parallel 4.2835s 
Without Parallel 33.0244s 
Acceleration factor 7.71