2017-05-23 6 views
1

그냥있는 멍청한 놈 : 나는 내가파이썬 다중 처리 풀 대 프로세스? 이러한 맥락에서

for file_chunk in file_chunks: 
    p = Process(target=my_func, args=(file_chunk, my_arg2)) 
    p.start() 
    # without .join(), otherwise main proc has to wait 
    # for proc1 to finish so it can start proc2 

을 시도했지만 그렇지 않은 것 같았다

짧은 시간에 큰 파일을 처리 할 수 ​​있도록 여러 프로세스에서 하나 개의 함수를 실행하려고 생각

너무 빠르네.

지금은 실제로 작업을 병렬로 실행하고 있는지 물어 본다. 나는 Pool에 대해서도 생각했다. 그러나 나는 python2를 사용하고 있으며 함수에 두 개의 인자를 매핑하는 것은보기 흉한 일이다.

위의 코드에서 위의 내용이 누락되었거나 위와 같은 방식으로 생성 된 프로세스가 실제로 paralelly로 실행됩니까?

+0

처리 할 청크의 수는 얼마나됩니까? 여기에 수백 가지 새로운 프로세스가 생겨나 고 있습니까? 풀을 사용하면 설정된 수의 작업자를 생성하고 시스템에 과부하를주지 않고 청크 (작업) 세트를 작업자로 나눌 수 있습니다. – svohara

+0

@svohara 나는이 코드와 함께 일어나지 않는 20 배 빠른 처리를 달성 할 수 있도록 단지 20 개의 청크만을 가지고있다. – doniyor

답변

2

속도 향상은 청크의 양이 아니라 PC에있는 CPU 코어의 양에 비례합니다.

이상적으로 CPU 코어가 4 개인 경우 속도가 4 배 향상됩니다. 성능 향상을 고려할 때 IPC 오버 헤드와 같은 다른 요소도 고려해야합니다.

너무 많은 프로세스를 스폰하면 CPU에서 서로 경쟁하여 성능에 부정적인 영향을 미칩니다.

대부분의 로직을 처리하려면 multiprocessing.Pool을 사용하는 것이 좋습니다. 인수가 여러 개인 경우 apply_async 메서드를 사용하십시오.

from multiprocessing import Pool 

pool = Pool() 

for file_chunk in file_chunks: 
    pool.apply_async(my_func, args=(file_chunk, arg1, arg2)) 
1

는 나도 전문가가 아니지만, 당신이 시도해야 할 것은이 가능한 CPU (n_jobs)의 번호를 사용하여 특정 기능 (random_function)를 실행합니다 joblib병렬

from joblib import Parallel, delayed 
import multiprocessing as mp 

def random_function(args): 
    pass 

proc = mp.cpu_count() 

Parallel(n_jobs=proc)(delayed(random_function)(args) for args in args_list) 

을 사용하고 있습니다.

부담없이 docs을 읽으십시오!

+0

와우 멋진 물건 thnx. didnt는 그것을 안다. – doniyor